/*
 * Webservices para consultar los Datos de un equipo
 *  Alineacion
 *  Jugadores Titulares
 *  Jugadores Reservas
 *  Objetos del Equipo
 *  Ropa disponible
 *  [entrenador]
 * and open the template in the editor.
 *
 * Document   : consultar_armario_equipo.jsp
 * Author     : paco
 *
 */

package com.bitoon.basketdudes.ws;


import com.bitoon.basketdudes.jpa.*;
import java.util.*;
import javax.naming.*;
import javax.persistence.*;

import javax.servlet.http.*;
import org.apache.log4j.*;
import org.jdom.*;

import org.jdom.output.XMLOutputter;

/**
 * @author paco FELC 2010
 */
public class DatosEquipo {

    Context         initContext = null;
    Context         envContext  = null;
    Logger          log         = Logger.getLogger(DatosEquipo.class);
    Configuracion   conf        = null;

    EntityManagerFactory emfBasket         = null;
    EntityManagerFactory emfCatalogo = null;
//    EntityManagerFactory emfRanking  = null;

    public DatosEquipo() {
        try {
            // JPA Units
//            emfRanking  = PersistenceManager.getInstance().getEntityManagerFactory("jpa_ranking");
//            emfCatalogo = PersistenceManager.getInstance().getEntityManagerFactory("jpa_catalogo");
            emfBasket   = PersistenceManager.getInstance().getEntityManagerFactory("jpa_basket");
            conf = Configuracion.getInstance();
        } catch (Exception e) {
            log.error("[ERROR][constructor]: No se puedo conectar a la base de datos: " , e);
        }

    }


    public String wsConsultarPartida(HttpServletRequest request, HttpServletResponse response) {

        EntityManager   em      = null;
        XMLOutputter    out     = null;
        Document        doc     = null;
        int             error   = 0;

        try {
            em = emfCatalogo.createEntityManager(); // check 07.08.2012

            int idPartida = Integer.parseInt(request.getParameter("idPartida"));

            Query q = em.createNamedQuery("Partida.findById");
            q.setParameter("id", idPartida);

             List<Partida> lista = (List<Partida>)q.getResultList();

             if (lista.size() == 0) {
                log.error("[TRAZA][Partida no encontradaal]: " + idPartida);
                error=-1; // No encontrado
             }
             Partida row = lista.get(0);

             /* componemos el xml */
             Element root=new Element("consultarPartida");
             Element el_error=new Element("err");
             el_error.setAttribute("cod",new Integer(error).toString());
             root.addContent(el_error);
             if ( error == 0) {
                Element el_partida=new Element("partida");
                el_partida.setAttribute("id",               String.valueOf(row.getId()));
                el_partida.setAttribute("equipo1_id",       String.valueOf(row.getEquipo1Id()));
                el_partida.setAttribute("equipo2_id",       String.valueOf(row.getEquipo2Id()));
                el_partida.setAttribute("cuarto_juego",     String.valueOf(row.getCuartoJuego()));
                el_partida.setAttribute("puntos_equipo1",   String.valueOf(row.getPuntosEquipo1()));
                el_partida.setAttribute("puntos_equipo2",   String.valueOf(row.getPuntosEquipo2()));
                el_partida.setAttribute("rankeable",        String.valueOf(row.getTipo()));
                el_partida.setAttribute("tiempo",           String.valueOf(row.getTiempo()));
                el_partida.setAttribute("estado",           String.valueOf(row.getEstado()));

                root.addContent(el_partida);
            }

            doc = new Document(root);//Creamos el documento
            doc.setDocType(null);
            out = new XMLOutputter();
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            log.error("[consultarPartida]: " , e);
            // pintarStackTrace(e.getStackTrace());
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }

    public String wsVestir(HttpServletRequest request, HttpServletResponse response, int p_check_session ) {
        /* Añade ropa a un jugador en un slot o Cambia la ropa existente en un slot*/
        /* La antigua ropa pasa al inventario en el caso de cambio*/
        /* Se recalculan las caracteristicas del jugador si la ropa afecta a las mismas */

        String          retorno = "";
        EntityManager   em = null;
        boolean         error = false;
        try {
            int  jugador_id_buscar   = Integer.parseInt(request.getParameter("jugador_id"));

            HttpSession miSesion    = request.getSession(true);
            String      sesion_id   = miSesion.getId();
            log.info("--------------");

            LoginAction la = new LoginAction();
            em = emfBasket.createEntityManager(); // check 07.08.2012
            Query q = em.createNamedQuery("Jugador.findById");
            q.setParameter("id", jugador_id_buscar);
            Jugador j = (Jugador)q.getSingleResult();

            if (p_check_session != 0 ) {
                int aux_usuario_id = la.comprobarSesionEquipo(sesion_id,j.getEquipo().getId(),em);
                if ( aux_usuario_id <0 ) {
                    retorno="error=-10;descripcion=Sesion Incorrecta";
                    error=true;
                }
            }
            if ( !error ) {
                Hashtable <Short,Integer>   ropa_jugador = new Hashtable();

                for (short i=1; i< 8;i ++) {
                    ropa_jugador.put ( (short)i, ( request.getParameter("slot"+i) != null ? Integer.parseInt(request.getParameter("slot"+i)) : -1 ) );
                }

                // retorno=vestirJugador ( jugador_id_buscar, ropa_jugador,0 );
                Vestidor vestidor = new Vestidor();
                retorno=vestidor.vestirJugador ( em, jugador_id_buscar, ropa_jugador,0 );
            }
        } catch (ExcepcionGeneral e) {
            log.error("[ERROR][VESTIR1]: " , e);
            retorno = "error="+e.getCodigo()+";descripcion="+e.getDescripion();
        } catch (Exception x) {
            log.error("[ERROR][VESTIR2]: ", x);
            retorno = "error=-100";
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }
        return retorno;
    }

    /*  VALE PARA VERSIONES DE JUEGO MENORES A LA 4000
     *  OJO VALE TAMBIÉN PARA EL SERVIDOR DE JUEGO
     *
        Esta función es la que se utiliza desde el LOBBY y desde el juego para la consulta los datos de un equipo
            Si p_check_session == false SERVIDOR DE JUEGO
            Si p_check_session == true  CLIENTE LOBBY
     */
    public String wsConsultarAlineacion(HttpServletRequest request, HttpServletResponse response, boolean p_check_session) {

        EntityManager   em        = null;
        XMLOutputter    out       = null;
        Document        doc       = null;
        int             error     = 0;
        int             id_buscar = 0 ;

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012
            id_buscar = Integer.parseInt(request.getParameter("idEquipo"));

            Query q = em.createNamedQuery("Equipo.findById");
            q.setParameter("idEquipo", id_buscar);

            List<Equipo> lista = q.getResultList();

            if (lista.isEmpty()) {
                log.error("[TRAZA][Equipo no encontrado]: " + id_buscar);
                error=-1; // No encontrado
            }
            Equipo row = lista.get(0);

            // Revisamos si el equipo tiene ropa que pueda haber caducado y actualiza el jugador
            // con las propiedades modificadas tras eliminare el efecto de la ropa.
            // Esto se puede optimizar con un campo "proxima_caducidad" en la tabla "equipo".
            if ( true ) {
                Vestidor vestidor = new Vestidor();
                int algo_caducado=vestidor.comprobarInstanciasRopaCaducada ( em, row );
                if ( algo_caducado > 0 )
                    log.debug("[ENCONTRADA ROPA CADUCADA]"+algo_caducado);
            }

            /* Recuperamos el aspecto del equipo */
            q = em.createNamedQuery("AspectoEquipo.findByEquipoId");
            q.setParameter("equipoId", id_buscar);
            List<AspectoEquipo> lista_aspecto = q.getResultList();

            if (lista_aspecto.isEmpty()) {
                log.error("[TRAZA][Equipo no encontrado]: " + id_buscar);
                error=-1; // No encontrado
            }

            // Seguimos devolviendo la posición del ranking por compatibilidad
            // Pero en el caso de WBCStar esta posición no tiene sentido
            int pos_ranking=0;
            if ( conf.BuscarValorConfiguracionInteger("wbcstar") != 1 ) {
                /* Recuperamos la posicion del ranking */
                q = em.createNamedQuery("Ranking.findById");
                q.setParameter("id", id_buscar);
                List<Ranking> lista_ranking = q.getResultList();

                if (lista_ranking.isEmpty()) {
                    log.error("[TRAZA][Ranking no encontrado]: " + id_buscar);
                } else {
                    pos_ranking = lista_ranking.get(0).getPosicion();
                }               
            }

            // componemos el xml
            Element root=new Element("consultarEquipo");
            root.setAttribute("err", new Integer(error).toString());

            if ( error == 0) {
                AspectoEquipo row_aspecto = lista_aspecto.get(0);

                Element el_equipo=new Element("equipo");
                root.addContent(el_equipo);

                /* Datos básicos del equipo */
                el_equipo.setAttribute("id",            String.valueOf(row.getId()));
                el_equipo.setAttribute("zona",          String.valueOf(row.getZonaId()));
                el_equipo.setAttribute("nombre",        row.getNombre());
                el_equipo.setAttribute("nick",          row.getNick());
                el_equipo.setAttribute("ranking",       String.valueOf(pos_ranking));

                el_equipo.setAttribute("puntos",        (row.getPuntos  ()==null?"0":String.valueOf(row.getPuntos   ())));
                el_equipo.setAttribute("usu_id",        String.valueOf(row.getUsuario().getId()));
                el_equipo.setAttribute("usu_nick",      row.getUsuario().getNickMostrar());
                el_equipo.setAttribute("entrenador_id", String.valueOf(row.getEntrenadorId()));
                el_equipo.setAttribute("nivel",         String.valueOf(row.getNivel()));
                el_equipo.setAttribute("experiencia",   (row.getExperiencia()==null?"0":String.valueOf(row.getExperiencia())));


                //el_equipo.setAttribute("isoLogo",   String.valueOf(row.get));
                Float f = row.getPowerplay();
                el_equipo.setAttribute("powerplay",     String.valueOf((int)f.intValue()*100));
                el_equipo.setAttribute("credito_talento", String.valueOf((int)row.getCreditoTalento()));

                // El lobby quiere mostrar estadísticas del equipo 
                q = em.createNamedQuery("EstEquipo.findByEquipoId");
                q.setParameter("equipoId", id_buscar);
                List<EstEquipo> lista_est_equipo = q.getResultList();

                if (lista_est_equipo.isEmpty()) {
                    log.error("[TRAZA][Estadisticas no encontradas]: " + id_buscar);

                    el_equipo.setAttribute("ganados",   String.valueOf(0));
                    el_equipo.setAttribute("jugados",  String.valueOf(0));
                } else {
                    EstEquipo row_est_equipo = lista_est_equipo.get(0);

                    el_equipo.setAttribute("ganados",   String.valueOf( row_est_equipo.getGanados ()));
                    el_equipo.setAttribute("jugados",  String.valueOf( row_est_equipo.getGanados() + row_est_equipo.getPerdidos()));
                }

                // Datos de la wbcstar 
                if ( conf.BuscarValorConfiguracionInteger("wbcstar") == 1 ) {                
                    RankWBCStar rank = new RankWBCStar();
                    el_equipo.setAttribute("rep", String.valueOf( row.getUsuario().getReputacion() ));
                    
                    Elo elo = rank.BuscarElo ( em, id_buscar);
                    if ( elo != null) {
                        el_equipo.setAttribute("div" , String.valueOf(elo.getDivision()) );
                        el_equipo.setAttribute("elo" , String.valueOf(Math.round(  elo.getElo     ()) ) );
                    }
                }
                
                // Datos vestimenta equipo 
                Element el_equipacion=new Element("equipacion");

                el_equipacion.setAttribute("camiseta"	, String.valueOf(row_aspecto.getCamiseta    ()));
                el_equipacion.setAttribute("pantalon"	, String.valueOf(row_aspecto.getPantalon    ()));
                el_equipacion.setAttribute("clr1" 	, String.valueOf(row_aspecto.getClr1	    ()));
                el_equipacion.setAttribute("clr2" 	, String.valueOf(row_aspecto.getClr2	    ()));
                el_equipacion.setAttribute("clr3" 	, String.valueOf(row_aspecto.getClr3	    ()));
                el_equipacion.setAttribute("clr21" 	, String.valueOf(row_aspecto.getClr21	    ()));
                el_equipacion.setAttribute("clr22" 	, String.valueOf(row_aspecto.getClr22	    ()));
                el_equipacion.setAttribute("clr23" 	, String.valueOf(row_aspecto.getClr23	    ()));
                el_equipacion.setAttribute("font" 	, String.valueOf(row_aspecto.getFont	    ()));
                el_equipacion.setAttribute("fontClr" 	, String.valueOf(row_aspecto.getFontClr	    ()));
                el_equipacion.setAttribute("fontEdge"	, String.valueOf(row_aspecto.getFontEdge    ()));
                el_equipacion.setAttribute("ball"	, String.valueOf(row_aspecto.getBallId      ()));
                el_equipo.addContent(el_equipacion);

                /* Mazo */
                Query q2 = em.createNamedQuery("Mazo.findByEquipoId");
                log.debug("[TRAZA] Buscando Mazo");
                q2.setParameter("equipoId", id_buscar);

                List<Mazo> lista_mazo = (List<Mazo>)q2.getResultList();

		if (lista_mazo.size() != 0) {
		    Mazo r_mazo=null;
                    for ( int i=0;i< lista_mazo.size(); i++) {
                        r_mazo = lista_mazo.get(i);
                        Element ele_mazo      = new Element("carta");

                        // datos de la carta
                        ele_mazo.setAttribute("cuarto",         String.valueOf(r_mazo.getMazoPK().getCuarto()));
                        ele_mazo.setAttribute("slot",           String.valueOf(r_mazo.getMazoPK().getSlot()));
                        ele_mazo.setAttribute("carta_id",       String.valueOf(r_mazo.getCarta().getId()));

                        el_equipo.addContent(ele_mazo);
                     }
                }

                /* Jugadores de la plantilla del equipo */
                Query q3 = em.createNamedQuery("Plantilla.findByEquipoId");
                log.debug("[TRAZA] Buscando plantilla");
                q3.setParameter("equipoId", id_buscar);

                List<Plantilla> l_jugador = (List<Plantilla>)q3.getResultList();

                if (l_jugador.size() == 0) {
                    log.error("[TRAZA][Equipo sin plantilla]: " + id_buscar);
                } else {

                    for ( int i=0;i< l_jugador.size(); i++) {
                        Plantilla r_plantilla   = l_jugador.get(i);
                        Element el_jugador      = new Element("jugador");
                        Element carac_basica    = new Element("carac_basica");
                        Element carac_ropa      = new Element("carac_ropa");
                        Element ropa_puesta     = new Element("ropa_puesta");

                        /* datos de plantilla */
                        el_jugador.setAttribute("id",            String.valueOf(r_plantilla.getPlantillaPK().getJugadorId()));
                        el_jugador.setAttribute("numero",        String.valueOf(r_plantilla.getPlantillaPK().getDorsal()));
                        el_jugador.setAttribute("titular",       String.valueOf(r_plantilla.getTitular()));
                        el_jugador.setAttribute("posicion",      String.valueOf(r_plantilla.getJugador().getMJugador().getPosicion1()));
                        el_jugador.setAttribute("demarcacion",   String.valueOf(r_plantilla.getDemarcacion()));

                        /* datos de jugador */
                        Jugador r_jugador= r_plantilla.getJugador();
                        el_jugador.setAttribute("m_jugador_id",  String.valueOf(r_jugador.getMJugador().getId()));
                        el_jugador.setAttribute("nombre_interno",String.valueOf(r_jugador.getMJugador().getNombreInterno()));
                        el_jugador.setAttribute("valoracion",    String.valueOf( (int) (r_jugador.getValoracion()*100.0)));
                        el_jugador.setAttribute("nivel",         String.valueOf(r_jugador.getNivel()));
//                        el_jugador.setAttribute("f_alta",        String.valueOf(r_jugador.getFAlta()));
//                        el_jugador.setAttribute("f_alta_equipo", String.valueOf(r_jugador.getFAltaEquipo()));
//                        el_jugador.setAttribute("precio_compra", String.valueOf( (int) (r_jugador.getPrecioCompra()*100.0)));
//                        el_jugador.setAttribute("puntos_compra", String.valueOf(r_jugador.getPuntosCompra()));
                        el_jugador.setAttribute("experiencia",   String.valueOf(r_jugador.getExperiencia()));

//                        el_jugador.setAttribute("nivel_ini", String.valueOf(r_jugador.getMJugador().getNivelIni()));


                        if (r_jugador.getTalento1() ==null )
                            el_jugador.setAttribute("talento1",      "0");
                        else
                            el_jugador.setAttribute("talento1",      String.valueOf(r_jugador.getTalento1()));

                        if (r_jugador.getTalento2() == null )
                            el_jugador.setAttribute("talento2",      "0");
                        else
                            el_jugador.setAttribute("talento2",      String.valueOf(r_jugador.getTalento2()));

                        if ( r_jugador.getTalento3()== null )
                            el_jugador.setAttribute("talento3",      "0");
                        else
                            el_jugador.setAttribute("talento3",      String.valueOf(r_jugador.getTalento3()));

                        if ( r_jugador.getTrait1() != null && r_jugador.getTrait1() != 0 )
                            el_jugador.setAttribute("tr1",      String.valueOf(r_jugador.getTrait1()));
                        
                        if ( r_jugador.getTrait2() != null && r_jugador.getTrait2() != 0 )
                            el_jugador.setAttribute("tr2",      String.valueOf(r_jugador.getTrait2()));
                        
                        /* Características básicas + evolución */
                        carac_basica.setAttribute("b_agr",     String.valueOf(r_jugador.getBAgresividad()));
                        carac_basica.setAttribute("b_def",     String.valueOf(r_jugador.getBDefensa    ()));
                        carac_basica.setAttribute("b_dri",     String.valueOf(r_jugador.getBDriblin    ()));
                        carac_basica.setAttribute("b_pas",     String.valueOf(r_jugador.getBPase       ()));
                        carac_basica.setAttribute("b_rea",     String.valueOf(r_jugador.getBReboteAtaque()));
                        carac_basica.setAttribute("b_red",     String.valueOf(r_jugador.getBReboteDefensa()));
                        carac_basica.setAttribute("b_res",     String.valueOf(r_jugador.getBResistencia()));
                        carac_basica.setAttribute("b_rob",     String.valueOf(r_jugador.getBRobo       ()));
                        carac_basica.setAttribute("b_spr",     String.valueOf(r_jugador.getBSprint     ()));
                        carac_basica.setAttribute("b_t1",      String.valueOf(r_jugador.getBT1         ()));
                        carac_basica.setAttribute("b_t2",      String.valueOf(r_jugador.getBT2         ()));
                        carac_basica.setAttribute("b_t3",      String.valueOf(r_jugador.getBT3         ()));
                        carac_basica.setAttribute("b_tap",     String.valueOf(r_jugador.getBTapon      ()));
                        carac_basica.setAttribute("b_twk",     String.valueOf(r_jugador.getBTeamwork   ()));
                        carac_basica.setAttribute("b_vel",     String.valueOf(r_jugador.getBVelocidad  ()));

                        el_jugador.addContent(carac_basica);

                        /* Características solo ropa */
                        carac_ropa.setAttribute("agr",	String.valueOf(r_jugador.getAgresividad	()));
                        carac_ropa.setAttribute("def",  String.valueOf(r_jugador.getDefensa	()));
                        carac_ropa.setAttribute("dri",	String.valueOf(r_jugador.getDriblin	()));
                        carac_ropa.setAttribute("pas", 	String.valueOf(r_jugador.getPase	()));
                        carac_ropa.setAttribute("rea",  String.valueOf(r_jugador.getReboteAtaque()));
                        carac_ropa.setAttribute("red",  String.valueOf(r_jugador.getReboteDefensa()));
                        carac_ropa.setAttribute("res",  String.valueOf(r_jugador.getResistencia	()));
                        carac_ropa.setAttribute("rob",  String.valueOf(r_jugador.getRobo	()));
                        carac_ropa.setAttribute("spr",  String.valueOf(r_jugador.getSprint	()));
                        carac_ropa.setAttribute("t1",	String.valueOf(r_jugador.getT1		()));
                        carac_ropa.setAttribute("t2",	String.valueOf(r_jugador.getT2		()));
                        carac_ropa.setAttribute("t3",	String.valueOf(r_jugador.getT3		()));
                        carac_ropa.setAttribute("tap",  String.valueOf(r_jugador.getTapon	()));
                        carac_ropa.setAttribute("twk",  String.valueOf(r_jugador.getTeamwork	()));
                        carac_ropa.setAttribute("vel",  String.valueOf(r_jugador.getVelocidad	()));
                        el_jugador.addContent(carac_ropa);

                        /* datos de ropa */
                        Query q4 = em.createNamedQuery("RopaJugador.findByJugadorId");
                        q4.setParameter("jugadorId", r_jugador.getId());

                        List<RopaJugador> l_ropa_jug = q4.getResultList();
                        for ( int j=0;j< l_ropa_jug.size(); j++) {
                            RopaJugador r_ropa_jug = l_ropa_jug.get(j);

                            if (r_ropa_jug.getRopa()!=null ) {
                                boolean funciona = true;
                                if ( r_ropa_jug.getUsos()== 0 )
                                    funciona = false;
                                if ( r_ropa_jug.getFCaduca()!=null && r_ropa_jug.getFCaduca().getTime()<86400000 )
                                    funciona = false;

                                /* Si no quedan usos y es el servidor de juego no le devolvemos que tiene ropa puesta en ese slot */
                                if ( p_check_session || funciona ) {

                                    String ropa_id = String.valueOf(r_ropa_jug.getRopa().getId());
                                    String usos    = String.valueOf(r_ropa_jug.getUsos());

                                    switch ( r_ropa_jug.getRopaJugadorPK().getSlot() )
                                    {
                                        case 1: // rbracer
                                            ropa_puesta.setAttribute("rbracer", ropa_id);
                                            if ( r_ropa_jug.getUsos()>-1 )
                                                ropa_puesta.setAttribute("rbu", usos );
                                            if ( r_ropa_jug.getFCaduca()!=null )
                                                ropa_puesta.setAttribute("rbf",Util.FechaFormateada(r_ropa_jug.getFCaduca()) );
                                            if ( r_ropa_jug.getRopaInstanciaId()!=null )
                                                ropa_puesta.setAttribute("rbi",String.valueOf(r_ropa_jug.getRopaInstanciaId()) );
                                            break;
                                        case 2: // lbracer
                                            ropa_puesta.setAttribute("lbracer", ropa_id);
                                            if ( r_ropa_jug.getUsos()>-1 )
                                                ropa_puesta.setAttribute("lbu", usos );
                                            if ( r_ropa_jug.getFCaduca()!=null )
                                                ropa_puesta.setAttribute("lbf",Util.FechaFormateada(r_ropa_jug.getFCaduca()) );
                                            if ( r_ropa_jug.getRopaInstanciaId()!=null )
                                                ropa_puesta.setAttribute("lbi",String.valueOf(r_ropa_jug.getRopaInstanciaId()) );
                                            break;
                                        case 3: // rwrist
                                            ropa_puesta.setAttribute("rwrist",  ropa_id);
                                            if ( r_ropa_jug.getUsos()>-1 )
                                                ropa_puesta.setAttribute("rwu", usos );
                                            if ( r_ropa_jug.getFCaduca()!=null )
                                                ropa_puesta.setAttribute("rwf",Util.FechaFormateada(r_ropa_jug.getFCaduca()) );
                                            if ( r_ropa_jug.getRopaInstanciaId()!=null )
                                                ropa_puesta.setAttribute("rwi",String.valueOf(r_ropa_jug.getRopaInstanciaId()) );
                                            break;
                                        case 4: // lwrist
                                            ropa_puesta.setAttribute("lwrist",  ropa_id);
                                            if ( r_ropa_jug.getUsos()>-1 )
                                                ropa_puesta.setAttribute("lwu", usos );
                                            if ( r_ropa_jug.getFCaduca()!=null )
                                                ropa_puesta.setAttribute("lwf",Util.FechaFormateada(r_ropa_jug.getFCaduca()) );
                                            if ( r_ropa_jug.getRopaInstanciaId()!=null )
                                                ropa_puesta.setAttribute("lwi",String.valueOf(r_ropa_jug.getRopaInstanciaId()) );
                                            break;
                                        case 5: // shoes
                                            ropa_puesta.setAttribute("shoes",   ropa_id );
                                            if ( r_ropa_jug.getUsos()>-1 )
                                                ropa_puesta.setAttribute("shu", usos );
                                            if ( r_ropa_jug.getFCaduca()!=null )
                                                ropa_puesta.setAttribute("shf",Util.FechaFormateada(r_ropa_jug.getFCaduca()) );
                                            if ( r_ropa_jug.getRopaInstanciaId()!=null )
                                                ropa_puesta.setAttribute("shi",String.valueOf(r_ropa_jug.getRopaInstanciaId()) );
                                            break;
                                        case 6: // rtatoo
                                            ropa_puesta.setAttribute("rtatoo",  ropa_id);
                                            break;
                                        case 7: // ltatoo
                                            ropa_puesta.setAttribute("ltatoo",  ropa_id);
                                            break;
        /*                                case 8: // extra1
                                            ropa_puesta.setAttribute("extra1",  ropa_id);
                                            break;
                                        case 9: // extra2
                                            ropa_puesta.setAttribute("extra2",  ropa_id);
                                            break;
                                        case 12: // extra3
                                            ropa_puesta.setAttribute("extra3",  ropa_id);
                                            break;
         */
                                        default:
        //                                    ropa_puesta.setAttribute(String.valueOf(r_ropa_jug.getRopaJugadorPK().getSlot()),ropa_id);
                                            break;
                                    }
                                }
                            }
                        }
                        el_jugador.addContent(ropa_puesta);
                        el_equipo.addContent(el_jugador);
                     }
                 }
            } else {
                btnLogger.getLogger().debug("[ERROR]: CONSULTAR ALINEACION:" + error);
            }

            doc=new Document(root);//Creamos el documento
            //doc.setDocType(new DocType("text/xml"));
            doc.setDocType(null);
            out=new XMLOutputter();

        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            log.error("[consultarAlineacion]: "+id_buscar, e);
//            pintarStackTrace(e.getStackTrace());
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }

    /* NUEVA VERSION DE consultar

     * ES LLAMADA DESDE DATOS_PLANTILLA.jsp TODAVIA NO UTILIZADA
     *
        Esta función es la que se utiliza desde el LOBBY y desde el juego para la consulta los datos de un equipo
            Si p_check_session == false SERVIDOR DE JUEGO
            Si p_check_session == true  CLIENTE LOBBY
     */
    public String wsConsultarDatosPlantilla(HttpServletRequest request, HttpServletResponse response, boolean p_check_session) {

        EntityManager   em        = null;
        XMLOutputter    out       = null;
        Document        doc       = null;
        int             error     = 0;
        int             id_buscar = 0 ;

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012
            id_buscar = Integer.parseInt(request.getParameter("idEquipo"));

            Query q = em.createNamedQuery("Equipo.findById");
            q.setParameter("idEquipo", id_buscar);

            List<Equipo> lista = q.getResultList();

            if (lista.isEmpty()) {
                log.error("[TRAZA][Equipo no encontrado]: " + id_buscar);
                error=-1; // No encontrado
            }
            Equipo row = lista.get(0);

            /* Recuperamos el aspecto del equipo */
            q = em.createNamedQuery("AspectoEquipo.findByEquipoId");
            q.setParameter("equipoId", id_buscar);
            List<AspectoEquipo> lista_aspecto = q.getResultList();

            if (lista_aspecto.isEmpty()) {
                log.error("[TRAZA][Equipo no encontrado]: " + id_buscar);
                error=-1; // No encontrado
            }

            /* Recuperamos la posicion del ranking */
            q = em.createNamedQuery("Ranking.findById");
            q.setParameter("id", id_buscar);
            List<Ranking> lista_ranking = q.getResultList();

            int pos_ranking=0;
            if (lista_ranking.isEmpty()) {
                log.error("[TRAZA][Ranking no encontrado]: " + id_buscar);
            } else {
                pos_ranking = lista_ranking.get(0).getPosicion();
            }

            // componemos el xml
            Element root=new Element("datEq");
            root.setAttribute("err", new Integer(error).toString());

            if ( error == 0) {
                AspectoEquipo row_aspecto = lista_aspecto.get(0);

                Element el_equipo=new Element("eq");
                root.addContent(el_equipo);

                /* Datos básicos del equipo */
                el_equipo.setAttribute("id",        String.valueOf(row.getId()));
                el_equipo.setAttribute("n1",        row.getNombre());
                el_equipo.setAttribute("n2",        row.getNick());
//              el_equipo.setAttribute("f_alta",    (row.getFAlta   ()==null? "":String.valueOf(row.getFAlta    ())));
                el_equipo.setAttribute("rnk",       String.valueOf(pos_ranking));

                el_equipo.setAttribute("pto",       (row.getPuntos  ()==null?"0":String.valueOf(row.getPuntos   ())));
                el_equipo.setAttribute("usu",       String.valueOf(row.getUsuario().getId()));
                el_equipo.setAttribute("unick",     row.getUsuario().getNickMostrar());
                el_equipo.setAttribute("ent",       String.valueOf(row.getEntrenadorId()));
                el_equipo.setAttribute("nvl",       String.valueOf(row.getNivel()));
                el_equipo.setAttribute("exp",       (row.getExperiencia()==null?"0":String.valueOf(row.getExperiencia())));

                Float f = row.getPowerplay();
                el_equipo.setAttribute("pwp",       String.valueOf((int)f.intValue()*100));
                el_equipo.setAttribute("tal",       String.valueOf((int)row.getCreditoTalento()));

                /* El lobby quiere mostrar estadísticas del equipo */
                q = em.createNamedQuery("EstEquipo.findByEquipoId");
                q.setParameter("equipoId", id_buscar);
                List<EstEquipo> lista_est_equipo = q.getResultList();

                if (lista_est_equipo.isEmpty()) {
                    log.error("[TRAZA][Estadisticas no encontradas]: " + id_buscar);

                    el_equipo.setAttribute("pg",  String.valueOf(0));
                    el_equipo.setAttribute("pj",  String.valueOf(0));
                } else {
                    EstEquipo row_est_equipo = lista_est_equipo.get(0);

                    el_equipo.setAttribute("pg",  String.valueOf( row_est_equipo.getGanados ()));
                    el_equipo.setAttribute("pj",  String.valueOf( row_est_equipo.getGanados() + row_est_equipo.getPerdidos()));
                }

                /* Datos vestimenta equipo */
                Element el_equipacion=new Element("clr");

                el_equipacion.setAttribute("c"	, String.valueOf(row_aspecto.getCamiseta    ()));
                el_equipacion.setAttribute("p"	, String.valueOf(row_aspecto.getPantalon    ()));
                el_equipacion.setAttribute("c1" , String.valueOf(row_aspecto.getClr1	    ()));
                el_equipacion.setAttribute("c2" , String.valueOf(row_aspecto.getClr2	    ()));
                el_equipacion.setAttribute("c3" , String.valueOf(row_aspecto.getClr3	    ()));
                el_equipacion.setAttribute("c21", String.valueOf(row_aspecto.getClr21	    ()));
                el_equipacion.setAttribute("c22", String.valueOf(row_aspecto.getClr22	    ()));
                el_equipacion.setAttribute("c23", String.valueOf(row_aspecto.getClr23	    ()));
                el_equipacion.setAttribute("f" 	, String.valueOf(row_aspecto.getFont	    ()));
                el_equipacion.setAttribute("fc" , String.valueOf(row_aspecto.getFontClr	    ()));
                el_equipacion.setAttribute("fe"	, String.valueOf(row_aspecto.getFontEdge    ()));
                el_equipacion.setAttribute("frt" , String.valueOf(row_aspecto.getFront	    ()));
                el_equipacion.setAttribute("bck" , String.valueOf(row_aspecto.getBack	    ()));
                el_equipacion.setAttribute("liId", String.valueOf(row_aspecto.getLogoimgId   ()));
                el_equipacion.setAttribute("liC1", String.valueOf(row_aspecto.getLogoimgClr1 ()));
                el_equipacion.setAttribute("liC2", String.valueOf(row_aspecto.getLogoimgClr2 ()));
                el_equipacion.setAttribute("liC3", String.valueOf(row_aspecto.getLogoimgClr3 ()));
                el_equipacion.setAttribute("liX" , String.valueOf(row_aspecto.getLogoimgX    ()));
                el_equipacion.setAttribute("liY" , String.valueOf(row_aspecto.getLogoimgY    ()));
                el_equipacion.setAttribute("liA" , String.valueOf(row_aspecto.getLogoimgAng  ()));
                el_equipacion.setAttribute("liE" , String.valueOf(row_aspecto.getLogoimgEsc  ()));
                el_equipacion.setAttribute("ltId", String.valueOf(row_aspecto.getLogotxtId   ()));
                el_equipacion.setAttribute("ltC1", String.valueOf(row_aspecto.getLogotxtClr1 ()));
                el_equipacion.setAttribute("ltC2", String.valueOf(row_aspecto.getLogotxtClr2 ()));
                el_equipacion.setAttribute("ltC3", String.valueOf(row_aspecto.getLogotxtClr3 ()));
                el_equipacion.setAttribute("ltX" , String.valueOf(row_aspecto.getLogotxtX    ()));
                el_equipacion.setAttribute("ltY" , String.valueOf(row_aspecto.getLogotxtY    ()));
                el_equipacion.setAttribute("ltA" , String.valueOf(row_aspecto.getLogotxtAng  ()));
                el_equipacion.setAttribute("ltE" , String.valueOf(row_aspecto.getLogotxtEsc  ()));

                el_equipo.addContent(el_equipacion);

                /* Mazo */
                Query q2 = em.createNamedQuery("Mazo.findByEquipoId");
                log.debug("[TRAZA] Buscando Mazo");
                q2.setParameter("equipoId", id_buscar);

                List<Mazo> lista_mazo = (List<Mazo>)q2.getResultList();

		if (lista_mazo.size() != 0) {
		    Mazo r_mazo=null;
                    for ( int i=0;i< lista_mazo.size(); i++) {
                        r_mazo = lista_mazo.get(i);
                        Element ele_mazo      = new Element("car");

                        // datos de la carta
                        ele_mazo.setAttribute("q",        String.valueOf(r_mazo.getMazoPK().getCuarto()));
                        ele_mazo.setAttribute("s",        String.valueOf(r_mazo.getMazoPK().getSlot()));
                        ele_mazo.setAttribute("id",       String.valueOf(r_mazo.getCarta().getId()));

                        el_equipo.addContent(ele_mazo);
                     }
                }

                /* Jugadores de la plantilla del equipo */
                Query q3 = em.createNamedQuery("Plantilla.findByEquipoId");
                log.debug("[TRAZA] Buscando plantilla");
                q3.setParameter("equipoId", id_buscar);

                List<Plantilla> l_jugador = (List<Plantilla>)q3.getResultList();

                if (l_jugador.size() == 0) {
                    log.error("[TRAZA][Equipo sin plantilla]: " + id_buscar);
                } else {

                    for ( int i=0;i< l_jugador.size(); i++) {
                        Plantilla r_plantilla   = l_jugador.get(i);
                        Element el_jugador      = new Element("jug");
                        Element carac_basica    = new Element("cb");
                        Element carac_ropa      = new Element("cr");
                        Element ropa_puesta     = new Element("ropa");

                        /* datos de plantilla */
                        el_jugador.setAttribute("id",    String.valueOf(r_plantilla.getPlantillaPK().getJugadorId()));
                        el_jugador.setAttribute("num",   String.valueOf(r_plantilla.getPlantillaPK().getDorsal()));
                        el_jugador.setAttribute("tit",   String.valueOf(r_plantilla.getTitular()));
                        el_jugador.setAttribute("pos",   String.valueOf(r_plantilla.getJugador().getMJugador().getPosicion1()));
                        el_jugador.setAttribute("dem",   String.valueOf(r_plantilla.getDemarcacion()));

                        /* datos de jugador */
                        Jugador r_jugador= r_plantilla.getJugador();
                        el_jugador.setAttribute("mod"     ,String.valueOf(r_jugador.getMJugador().getId()));
                        el_jugador.setAttribute("nom"     ,String.valueOf(r_jugador.getMJugador().getNombreInterno()));
                        el_jugador.setAttribute("val"     ,String.valueOf( (int) (r_jugador.getValoracion()*100.0)));
                        el_jugador.setAttribute("nvl"     ,String.valueOf(r_jugador.getNivel()));
//                        el_jugador.setAttribute("f_alta",        String.valueOf(r_jugador.getFAlta()));
//                        el_jugador.setAttribute("f_alta_equipo", String.valueOf(r_jugador.getFAltaEquipo()));
//                        el_jugador.setAttribute("precio_compra", String.valueOf( (int) (r_jugador.getPrecioCompra()*100.0)));
//                        el_jugador.setAttribute("puntos_compra", String.valueOf(r_jugador.getPuntosCompra()));
                        el_jugador.setAttribute("exp"     ,String.valueOf(r_jugador.getExperiencia()));

//                        el_jugador.setAttribute("nivel_ini", String.valueOf(r_jugador.getMJugador().getNivelIni()));


                        if (r_jugador.getTalento1() ==null )
                            el_jugador.setAttribute("t1",      "0");
                        else
                            el_jugador.setAttribute("t1",      String.valueOf(r_jugador.getTalento1()));

                        if (r_jugador.getTalento2() == null )
                            el_jugador.setAttribute("t2",      "0");
                        else
                            el_jugador.setAttribute("t2",      String.valueOf(r_jugador.getTalento2()));

                        if ( r_jugador.getTalento3()== null )
                            el_jugador.setAttribute("t3",      "0");
                        else
                            el_jugador.setAttribute("t3",      String.valueOf(r_jugador.getTalento3()));

                        /* Características básicas + evolución */
                        carac_basica.setAttribute("b0",     String.valueOf(r_jugador.getBT2         ()));
                        carac_basica.setAttribute("b1",     String.valueOf(r_jugador.getBT3         ()));
                        carac_basica.setAttribute("b2",     String.valueOf(r_jugador.getBT1         ()));

                        carac_basica.setAttribute("b3",     String.valueOf(r_jugador.getBAgresividad()));
                        carac_basica.setAttribute("b4",     String.valueOf(r_jugador.getBDriblin    ()));
                        carac_basica.setAttribute("b5",     String.valueOf(r_jugador.getBPase       ()));
                        carac_basica.setAttribute("b6",     String.valueOf(r_jugador.getBReboteAtaque()));

                        carac_basica.setAttribute("b7",     String.valueOf(r_jugador.getBReboteDefensa()));
                        carac_basica.setAttribute("b8",     String.valueOf(r_jugador.getBRobo       ()));
                        carac_basica.setAttribute("b9",     String.valueOf(r_jugador.getBTapon      ()));
                        carac_basica.setAttribute("b10",    String.valueOf(r_jugador.getBDefensa    ()));

                        carac_basica.setAttribute("b11",    String.valueOf(r_jugador.getBResistencia()));
                        carac_basica.setAttribute("b12",    String.valueOf(r_jugador.getBVelocidad  ()));
                        carac_basica.setAttribute("b13",    String.valueOf(r_jugador.getBSprint     ()));
                        carac_basica.setAttribute("b14",    String.valueOf(r_jugador.getBTeamwork   ()));

                        el_jugador.addContent(carac_basica);

                        /* Características solo ropa */
                        carac_ropa.setAttribute("r0",	String.valueOf(r_jugador.getT2		()));
                        carac_ropa.setAttribute("r1",	String.valueOf(r_jugador.getT3		()));
                        carac_ropa.setAttribute("r2",	String.valueOf(r_jugador.getT1		()));

                        carac_ropa.setAttribute("r3",	String.valueOf(r_jugador.getAgresividad	()));
                        carac_ropa.setAttribute("r4",	String.valueOf(r_jugador.getDriblin	()));
                        carac_ropa.setAttribute("r5", 	String.valueOf(r_jugador.getPase	()));
                        carac_ropa.setAttribute("r6",   String.valueOf(r_jugador.getReboteAtaque()));

                        carac_ropa.setAttribute("r7",   String.valueOf(r_jugador.getReboteDefensa()));
                        carac_ropa.setAttribute("r8",   String.valueOf(r_jugador.getRobo	()));
                        carac_ropa.setAttribute("r9",   String.valueOf(r_jugador.getTapon	()));
                        carac_ropa.setAttribute("r10",  String.valueOf(r_jugador.getDefensa	()));

                        carac_ropa.setAttribute("r11",  String.valueOf(r_jugador.getResistencia	()));
                        carac_ropa.setAttribute("r12",  String.valueOf(r_jugador.getVelocidad	()));
                        carac_ropa.setAttribute("r13",  String.valueOf(r_jugador.getSprint	()));
                        carac_ropa.setAttribute("r14",  String.valueOf(r_jugador.getTeamwork	()));

                        el_jugador.addContent(carac_ropa);

                        /* datos de ropa */
                        Query q4 = em.createNamedQuery("RopaJugador.findByJugadorId");
                        q4.setParameter("jugadorId", r_jugador.getId());

                        List<RopaJugador> l_ropa_jug = q4.getResultList();
                        for ( int j=0;j< l_ropa_jug.size(); j++) {
                            RopaJugador r_ropa_jug = l_ropa_jug.get(j);

                            if (r_ropa_jug.getRopa()!=null) {
                                String ropa_id = String.valueOf(r_ropa_jug.getRopa().getId());
                                switch ( r_ropa_jug.getRopaJugadorPK().getSlot() )
                                {
                                    case 1: // rbracer
                                        ropa_puesta.setAttribute("r2", ropa_id);
                                        ropa_puesta.setAttribute("u2", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
                                    case 2: // lbracer
                                        ropa_puesta.setAttribute("r3", ropa_id);
                                        ropa_puesta.setAttribute("u3", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
                                    case 3: // rwrist
                                        ropa_puesta.setAttribute("r4",  ropa_id);
                                        ropa_puesta.setAttribute("u4", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
                                    case 4: // lwrist
                                        ropa_puesta.setAttribute("r5",  ropa_id);
                                        ropa_puesta.setAttribute("u5", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
                                    case 5: // shoes
                                        ropa_puesta.setAttribute("r6",   ropa_id );
                                        ropa_puesta.setAttribute("u6", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
                                    case 6: // rtatoo
                                        ropa_puesta.setAttribute("r1",  ropa_id);
                                        ropa_puesta.setAttribute("u1", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
                                    case 7: // ltatoo
                                        ropa_puesta.setAttribute("r0",  ropa_id);
                                        ropa_puesta.setAttribute("u0", String.valueOf(r_ropa_jug.getUsos()));
                                        break;
    /*                                case 8: // extra1
                                        ropa_puesta.setAttribute("extra1",  ropa_id);
                                        break;
                                    case 9: // extra2
                                        ropa_puesta.setAttribute("extra2",  ropa_id);
                                        break;
                                    case 12: // extra3
                                        ropa_puesta.setAttribute("extra3",  ropa_id);
                                        break;
     */
                                    default:
    //                                    ropa_puesta.setAttribute(String.valueOf(r_ropa_jug.getRopaJugadorPK().getSlot()),ropa_id);
                                        break;
                                }
                            }
                        }
                        el_jugador.addContent(ropa_puesta);
                        el_equipo.addContent(el_jugador);
                     }
                 }
            } else {
                btnLogger.getLogger().debug("[ERROR]: CONSULTAR ALINEACION:" + error);
            }

            doc=new Document(root);//Creamos el documento
            //doc.setDocType(new DocType("text/xml"));
            doc.setDocType(null);
            out=new XMLOutputter();

        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            log.error("[consultarAlineacion]: "+id_buscar, e);
//            pintarStackTrace(e.getStackTrace());
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }


    public String wsConsultarArmario(HttpServletRequest request, HttpServletResponse response) {
        EntityManager   em      = null;
        XMLOutputter    out     = null;
        Document        doc     = null;
        int             error   = 0;

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012
            int id_buscar = Integer.parseInt(request.getParameter("equipo_id"));
            Query q = em.createNamedQuery("ArmarioEquipo.findByEquipoId");
            q.setParameter("equipoId", id_buscar);

            List<ArmarioEquipo> lista = q.getResultList();

            btnLogger.getLogger().debug("Leyendo ropa armario");

            // componemos el xml
            Element root=new Element("consultarArmarioEquipo");
            root.setAttribute("err", new Integer(error).toString());

            // ROPA NO INSTANCIABLE
            for ( int i=0;i< lista.size(); i++) {
                ArmarioEquipo row = lista.get(i);
                Element el_armario=new Element("ArmarioEquipo");
                root.addContent(el_armario);

                /* Datos de la ropa del armario del equipo */
                el_armario.setAttribute("ropa_id",      String.valueOf(row.getArmarioEquipoPK().getRopaId()));
                el_armario.setAttribute("cantidad",     String.valueOf(row.getCantidad()));
//                el_armario.setAttribute("textura",      String.valueOf(row.getRopa().getTextura()));
//                el_armario.setAttribute("modelo",       String.valueOf(row.getRopa().getModelo()));
//                el_armario.setAttribute("cat_id",       String.valueOf(row.getRopa().getCategoria().getId()));
            }

            Query q2 = em.createNamedQuery("RopaInstancia.findNoEquipados");
            q2.setParameter("equipo_id", id_buscar);
            List<RopaInstancia> ilista = q2.getResultList();

            // ROPA INSTANCIABLE
            for ( int i=0;i< ilista.size(); i++) {
                RopaInstancia row = ilista.get(i);
                Element el_armario=new Element("ArmarioEquipo");
                root.addContent(el_armario);

                /* Datos las instancias de ropa */
                el_armario.setAttribute("ropa_id",      String.valueOf(row.getRopa().getId()));
                el_armario.setAttribute("cantidad",     "1");
                el_armario.setAttribute("id",           String.valueOf(row.getId()));
                if ( row.getFCaduca()!= null ) {
                    el_armario.setAttribute("f_fin",    Util.FechaFormateada(row.getFCaduca()));
                    el_armario.setAttribute("f_ini",    Util.FechaFormateada(row.getFCompra()));
                }
                if ( row.getUsos()>-1)
                    el_armario.setAttribute("usos",     String.valueOf(row.getUsos()));
            }

            doc=new Document(root);//Creamos el documento
            doc.setDocType(null);
            out=new XMLOutputter();

        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            log.error("[consultarArmarioEquipo]: " , e);
            //pintarStackTrace(e.getStackTrace());
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);

    }

    public String wsConsultarCartaEquipo(HttpServletRequest request, HttpServletResponse response, boolean p_check_session) {
        EntityManager   em      = null;
        XMLOutputter    out     = null;
        Document        doc     = null;
        int             error   = 0;

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012
            int equipo_id=0;
            equipo_id = Integer.parseInt(request.getParameter("equipo_id"));
log.debug ( "p_check_session sesion " + p_check_session);
            if ( p_check_session ) {
log.debug ( "Chequeando sesion " + request.getSession().getId());
                equipo_id = ComprobarEquipoSesion (em, request.getSession().getId(),equipo_id);
            }
            /* Buscamos Equipo */

log.debug ( "EQUIPO " + equipo_id);

            Query q = em.createNamedQuery("CartaEquipo.findByEquipoId");
            q.setParameter("equipoId", equipo_id);

            List<CartaEquipo> lista = q.getResultList();

            btnLogger.getLogger().debug("Consultar Carta Equipo");

            // componemos el xml
            Element root=new Element("consultarCartaEquipo");
            root.setAttribute("err", new Integer(error).toString());

            for ( int i=0;i< lista.size(); i++) {
                CartaEquipo row = lista.get(i);
                Element el_armario=new Element("CartaEquipo");
                root.addContent(el_armario);

                /* Datos básicos del equipo */
                el_armario.setAttribute("carta_id",             String.valueOf(row.getCartaEquipoPK().getCartaId()));
                el_armario.setAttribute("cantidad",             String.valueOf(row.getCantidad()));
                el_armario.setAttribute("modelo_categoria_id",  String.valueOf(row.getCarta().getMCarta().getCategoriaId()));
                el_armario.setAttribute("modelo_carta_id",      String.valueOf(row.getCarta().getMCarta().getId()));
//                el_armario.setAttribute("textura",      String.valueOf(row.getCarta().getTextura()));
//                el_armario.setAttribute("modelo",       String.valueOf(row.getCarta().getModelo()));
//                el_armario.setAttribute("cat_id",       String.valueOf(row.get().getCategoria().getId()));
            }

            doc=new Document(root);//Creamos el documento
            doc.setDocType(null);
            out=new XMLOutputter();

        } catch (Exception e) {
            try {
                if ( em != null && em.getTransaction().isActive() )
                    em.getTransaction().rollback();
            } catch (Exception e2) { }
            log.error("[consultarCartaEquipo]: " , e);
            //pintarStackTrace(e.getStackTrace());
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);

    }

    public String wsFinPartida(HttpServletRequest p_request, HttpServletResponse response) {
        String          retorno = "";
        EntityManager   em      = null;
        EntityManager   em_rank = null;

        String          jugadores1="";
        String          jugadores2="";
        String          subida1="";
        String          subida2="";

        int obj1        = 0;
        int carta1      = 0;
        int puntos1     = 0;
        int jug1        = 0;
        int esp1        = 0;
        int talento1    = 0;
        int obj2        = 0;
        int carta2      = 0;
        int puntos2     = 0;
        int jug2        = 0;
        int esp2        = 0;
        int talento2    = 0;

        boolean maximo_hoy=false;
        int     pve       =-1;
        Competicion     comp= new Competicion();

        log.debug("[DEBUG][FIN PARTIDA]: " );
        log.error("V 2.13 01/08/2013" );        
        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012
            em.getTransaction().begin();

            // Datos para guardar la partida
            int partida_id  = extractIntParameter( "partida_id" ,p_request);
            int tanteo1     = extractIntParameter( "tanteo1"    ,p_request);
            int tanteo2     = extractIntParameter( "tanteo2"    ,p_request);
            int aux_exp1    = extractIntParameter( "exp1"       ,p_request);
            int aux_exp2    = extractIntParameter( "exp2"       ,p_request);
            int pto1        = extractIntParameter( "pto1"       ,p_request);
            int pto2        = extractIntParameter( "pto2"       ,p_request);
            int segundos    = extractIntParameter( "seg"        ,p_request);
            int abandono    = extractIntParameter( "aba"        ,p_request);

            // Si hay activo evento multiplicador de experiencia
            int factor_experiencia = conf.BuscarValorConfiguracionInteger("factor_experiencia_equipo");
            int exp1 = aux_exp1 * factor_experiencia;
            int exp2 = aux_exp2 * factor_experiencia;

            // Datos para la entrega de premios (chestball)
            int chestball1  = extractIntParameter( "chestball1" ,p_request);
            if ( chestball1 != 0) {
                obj1        = extractIntParameter( "obj1"       ,p_request);
                carta1      = extractIntParameter( "carta1"     ,p_request);
                puntos1     = extractIntParameter( "puntos1"    ,p_request);
                jug1        = extractIntParameter( "jug1"       ,p_request);
                esp1        = extractIntParameter( "esp1"       ,p_request);
                talento1    = extractIntParameter( "talento1"   ,p_request);
            }
            int chestball2  = extractIntParameter( "chestball2" ,p_request);
            if ( chestball2 != 0) {
                obj2        = extractIntParameter( "obj2"       ,p_request);
                carta2      = extractIntParameter( "carta2"     ,p_request);
                puntos2     = extractIntParameter( "puntos2"    ,p_request);
                jug2        = extractIntParameter( "jug2"       ,p_request);
                esp2        = extractIntParameter( "esp2"       ,p_request);
                talento2    = extractIntParameter( "talento2"   ,p_request);
            }

            /* Formato de la url de llamada del servidor de juego:
             *   partida_id=xx &
             *   minutos=xx
             *   aba=xx        & (abandono 0 - ninguno o id_equipo que abandona)
             *   tanteo1=xx    &
             *   tanteo2=xx    &
             *   exp1=xx       &
             *   exp2=xx       &
             *   pto1=xx       &
             *   pto2=xx       &
             *   chest1=xx     &  (tipo de chestball)
             *   chest2=xx     &
             *   obj1=xx       &  (probabilidad conseguir equipación)
             *   obj2=xx       &
             *   jug1=xx       &  (probabilidad conseguir jugador)
             *   jug2=xx       &
             *   esp1=xx       &  (probabilidad conseguir obj.especial)
             *   esp2=xx       &
             *   talento1=xx   &  (probabilidad conseguir talento)
             *   talento2=xx   &
             *

             Estadísticas:
            c- casa
            v- visitante
            jid - identificador de jugador
            mi - minutos
            t1 - tiro libres
            p1 - anotados libres
            t2 - tiro campo
            p2 - puntos de campo
            t3 - triples intentados
            p3 - triples anotados
            ra - rebotes ataque
            rd - rebotes defensa
            ra - rebotes ataque
            rd - rebotes defensa
            as - asistencias
            re - recuperaciones/robos
            pe - perdidas
            ta - tapones hechos
            tr - tapones recibidos
            fa - faltas
            fr - faltas recibidas
            va - valoracion
            ex - experiencia ganada

&c0=jid|mi|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c1=jid|mi|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
             ...
&v8=jid|mi|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v9=jid|mi|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex

            Cartas gastadas (casa y visitante):
            &cc=carta_id|cantidad|carta_id2|cantidad2...|carta_idN|cantidadN
            &cv=carta_id|cantidad|carta_id2|cantidad2...|carta_idN|cantidadN
             *
             *
             *
             *
             */
log.info("partida: " + partida_id );
log.info("segundos:" + segundos );
log.info("tanteo1: " + tanteo1 );
log.info("tanteo2: " + tanteo2 );
log.info("aba:     " + abandono );
log.info("exp1:    " + aux_exp1 );
log.info("exp2:    " + aux_exp2 );
log.info("factor:  " + factor_experiencia );
log.info("exp1 *:  " + exp1 );
log.info("exp2 *:  " + exp2 );
log.info("pto1:    " + pto1 );
log.info("pto2:    " + pto2 );
log.info("---------" );
log.info("chest1:  " + chestball1 );
log.info("obj1:    " + obj1 );
log.info("carta1:  " + carta1 );
log.info("puntos1: " + puntos1 );
log.info("jug1:    " + jug1 );
log.info("esp1:    " + esp1 );
log.info("talento1:" + talento1 );
log.info("-----------" );
log.info("chest2:  " + chestball2 );
log.info("obj2:    " + obj2 );
log.info("carta2:  " + carta2 );
log.info("puntos2: " + puntos2 );
log.info("jug2:    " + jug2 );
log.info("esp2:    " + esp2 );
log.info("talento2:" + talento2 );
log.info("[DEBUG][Parametros correctos]: " );

            /* Buscamos la partida */
            Query q = em.createNamedQuery("Partida.findById");
            q.setParameter("id"   , partida_id);

            List<Partida> lista_partida = q.getResultList();
            if ( lista_partida == null || lista_partida.isEmpty() ) {
                throw new ExcepcionGeneral( -3, "Partida no existe " + partida_id );
            }
            Partida partida = lista_partida.get(0);

log.info("[DEBUG][Partida Correcta]: " );
            /* Buscamos contendientes */
            q = em.createNamedQuery("Equipo.findById");
            q.setParameter("idEquipo"   , partida.getEquipo1Id());
            List<Equipo> lista_equipo1 = q.getResultList();
            if ( lista_equipo1 == null || lista_equipo1.isEmpty() ) {
                throw new ExcepcionGeneral( -3, "Equipo1 no existe " + partida.getEquipo1Id() );
            }
            Equipo equipo1 = lista_equipo1.get(0);

            q = em.createNamedQuery("Equipo.findById");
            q.setParameter("idEquipo"   , partida.getEquipo2Id());
            List<Equipo> lista_equipo2 = q.getResultList();
            if ( lista_equipo2 == null || lista_equipo2.isEmpty() ) {
                throw new ExcepcionGeneral( -3, "Equipo2 no existe " + partida.getEquipo2Id() );
            }
            Equipo equipo2 = lista_equipo2.get(0);

            Date f_ultimo = Calendar.getInstance().getTime();
            {
                pve = -1;
                if ( equipo1.getEntrenadorId()== -1 ) {
                    pve = equipo1.getId();
                    if ( abandono > 0 )
                        abandono = equipo2.getId();
                }
                if ( equipo2.getEntrenadorId()== -1 ) {
                    pve = equipo2.getId();
                    if ( abandono > 0 )
                        abandono = equipo1.getId();
                }
            }

            /* Actualizamos el estado de la partida y el tanteo final */
            partida.setPuntosEquipo1(tanteo1);
            partida.setPuntosEquipo2(tanteo2);
            partida.setEstado(4); // finalizado
            if ( abandono > 0 ) {
                partida.setAbandonador(abandono);
            }
            if ( pve == -1 ) {                
                if ( abandono > 0 ) {                   
                    // Comprobamos si hay una salida amistosa (salami)
                    int salami=0;
                    if ( p_request.getParameter("salami") != null ) {
                        salami = Integer.parseInt(p_request.getParameter("salami"));
log.error("++++++++++++++++++++++++++++++++++++++++++++++++");                                        
log.error("++++++++++++++++++++ SALAMI ++++++++++++++++++++");                
log.error("++++++++++++++++++++++++++++++++++++++++++++++++");                                        
                    }
                    Equipo equipo_abandonador = null;
                    if ( abandono == equipo1.getId() ) {
                        equipo_abandonador = equipo1;
                    } else {
                        equipo_abandonador = equipo2;
                    }
                    
                    if ( salami == 0 ) {
                        // Abandono no amistoso
                        ActualizarReputacion (  equipo_abandonador, partida.getTipo() );
                    } else {                        
                        equipo_abandonador.setAbandonos( equipo_abandonador.getAbandonos() +1 );
                    /*
                            // Aumentamos los abandonos amistosos para limitarlos a 7 a la semana
                            AumentaAbandono ( em, equipo_abandonador );
                    */
                    }
                } else {
                    /* si no hay abandonadores se incrementa en 1 la reputación de ambos */
                    equipo1.getUsuario().setReputacion(equipo1.getUsuario().getReputacion()+1);
                    equipo2.getUsuario().setReputacion(equipo2.getUsuario().getReputacion()+1);

log.info(" AUMENTANDO REPUTACION" + equipo1.getUsuario().getReputacion() );
log.info(" AUMENTANDO REPUTACION" + equipo2.getUsuario().getReputacion() );
                }
            }
            /* Guardamos el Partido */
            Partido est_partido = new Partido ( );
            est_partido.setId     (partida_id);
            est_partido.setEquipo1(equipo1);
            est_partido.setEquipo2(equipo2);

            est_partido.setEstado   ( (short)partida.getEstado());
            est_partido.setFPartido ( new Date() );
            est_partido.setPuntos1  ((short)tanteo1);
            est_partido.setPuntos2  ((short)tanteo2);

            float min_jugados = (float)(segundos)/60.0f;

            est_partido.setMinutosJugados( min_jugados );
            est_partido.setMinutos  ((short)partida.getTiempo());

            if ( partida.getCuartoJuego() == 0 ) { //No acabó el primer cuarto y abandono
                est_partido.setT11      ((short)tanteo1);
                est_partido.setT21      ((short)tanteo2);
            } else {
                est_partido.setT11      ((short)partida.getT11());
                est_partido.setT21      ((short)partida.getT21());
            }

            if ( partida.getCuartoJuego() == 1 ) { //No acabó el segundo cuarto y abandono
                est_partido.setT12      ((short)(tanteo1 -partida.getT11()) );
                est_partido.setT22      ((short)(tanteo2 -partida.getT21()) );
            } else {
                est_partido.setT12      ((short)partida.getT12());
                est_partido.setT22      ((short)partida.getT22());
            }

            if ( partida.getCuartoJuego() == 2 ) {
                est_partido.setT13      ((short)(tanteo1 -partida.getT11()-partida.getT12()) );
                est_partido.setT23      ((short)(tanteo2 -partida.getT21()-partida.getT22()) );
            } else {
                est_partido.setT13      ((short)partida.getT13());
                est_partido.setT23      ((short)partida.getT23());
            }

            if ( partida.getCuartoJuego() == 3 || partida.getCuartoJuego() == 4) {
                /* como el servidor no actualiza el último cuarto en catalogo.partidos calculamos la diferencia */
                est_partido.setT14      ((short)(tanteo1-partida.getT11()-partida.getT12()-partida.getT13()));
                est_partido.setT24      ((short)(tanteo2-partida.getT21()-partida.getT22()-partida.getT23()));
            }
            est_partido.setTipo     ((short)partida.getTipo());
log.debug(" --->TIPO DE PARTIDO: " + partida.getTipo());

            if ( est_partido.getTipo()==2 ) {
log.debug(" ACTUALIZAMOS partido con id calendario " + partida.getCompeticionId());
                est_partido.setJornadaId(partida.getCompeticionId());
            } else {
                est_partido.setJornadaId(0);
            }

            em.persist(est_partido);
            if ( est_partido.getTipo()==1 ||
                 est_partido.getTipo()==2 ||
                 est_partido.getTipo()==4 ||
                 est_partido.getTipo()==5 ||
                 est_partido.getTipo()==6
                 ) {
                /* **************************** ID ESTADISTICAS
                 * PARTIDO OFICIAL (RETO/DUELO)  1    SI
                 * PARTIDO DE TORNEO DE USUARIO  2    SI
                 * PARTIDO AMISTOSO              3
                 * PARTIDO PVE                   4
                 * PARTIDO RANKEABLE             5    SI
                 * PARTIDO DIVISION              6    SI
                 */
log.info("[---PARTIDO CON ESTADISTICAS---]" );
                int ant_nivel1=1;
                int ant_nivel2=1;


                if ( est_partido.getTipo()==2 ) {
                    //Competicion comp= new Competicion();
log.debug(" ACTUALIZAMOS datos Torneo Personalizado" + partida.getCompeticionId());
                    //comp.setEntityManager       ( em );
                    comp.actualizarTorneoUsuario( partida.getCompeticionId(), partida_id, 1, partida.getfAlta(),
                                                   partida.getPuntosEquipo1(), partida.getPuntosEquipo2(), abandono, em );
                }

                maximo_hoy= ActualizarParciales( em, partida, equipo1, equipo2, pve, f_ultimo );
                
                // Guardamos experiencia y calculamos nivel
                if ( maximo_hoy == false ) {
                    if ( pve!=equipo1.getId() )
                        ant_nivel1=EquipoGuardarExperiencia (em, comp, equipo1, exp1, pto1  );

                    if ( pve!=equipo2.getId() )
                        ant_nivel2=EquipoGuardarExperiencia (em, comp, equipo2, exp2, pto2  );
                }

                // Actualizamos la fecha del último partido
                if ( pve != equipo1.getId() )
                    equipo1.setfUltimo( Calendar.getInstance().getTime() );
                if ( pve != equipo2.getId() )
                    equipo2.setfUltimo( Calendar.getInstance().getTime() );

                log.info("[DEBUG][Partida Datos guardados]: " );

                log.info("[DEBUG][Actualizamos Ultimos Partidos " );
                if ( est_partido.getTipo()==5 ||
                     est_partido.getTipo()==6
                     ) {
                     comp.GrabarUltimosPartidos(em, equipo1, equipo2 );
                     comp.GrabarUltimosPartidos(em, equipo2, equipo1 );
                }

                if ( pve == -1 ) {
                    // R A N K I N G
                    if ( conf.BuscarValorConfiguracionInteger("wbcstar") == 1 ) {
                        if ( est_partido.getTipo()==5 || est_partido.getTipo()==6 ) {
                            if ( equipo1.getNivel()>14 && equipo2.getNivel()>14 &&
                                 ant_nivel1!=14 && ant_nivel2!=14) {
                                 if ( est_partido.getTipo()==5 || est_partido.getTipo()==6 ) {
                                    comp.calcularElo ( em, equipo1, equipo2, est_partido,
                                                       abandono, partida.getCuartoJuego() );
                                 }
                            } else {
                                // v2.13
                                // Si es un partido de un PromoPool contra un Pro
                                // Calculamos el asp solo del primer equipo
                                if ( equipo1.getNivel()>14 && equipo2.getNivel()<15 || 
                                     equipo2.getNivel()>14 && equipo1.getNivel()<15
                                     ) {
                                    comp.calcularEloContraPro ( em, equipo1, equipo2, est_partido );
                                }                                
                                
                                // guardamos el resultado de los equipos de nivel < 15 en su competición semanal
                                if ( equipo1.getNivel()<15 ) {
                                    // Si estamos en la hora del recalculo del ranking acumulado no acumulamos
                                    if ( comp.HoraRankingAbierto() ) {
                                        int puntos_acumular1= comp.puntosAcumular ( equipo1, (equipo1.getId()==abandono),
                                                    (tanteo1>tanteo2 ), partida.getCuartoJuego(),partida.getTiempo() );
                                           guardaAcumulado ( em, equipo1, puntos_acumular1 );
                                    } else {
                                        log.debug("Eq1 Hora de calculo de ranking <15" );
                                    }

                                    /*guardaAcumulado ( em, equipo1, (equipo1.getId()==abandono),
                                        (tanteo1>tanteo2 ), partida.getCuartoJuego(),partida.getTiempo() ); */
                                }
                                if ( equipo2.getNivel()<15) {
                                    // Si estamos en la hora del recalculo del ranking acumulado no acumulamos
                                    if ( comp.HoraRankingAbierto() ) {
                                        int puntos_acumular2= comp.puntosAcumular ( equipo2, (equipo2.getId()==abandono),
                                            (tanteo2>tanteo1), partida.getCuartoJuego(),partida.getTiempo() );
                                        guardaAcumulado ( em, equipo2, puntos_acumular2 );
                                    } else {
                                        log.debug("Eq2 Hora de calculo de ranking <15");
                                    }

                                    /* guardaAcumulado ( em, equipo2, (equipo2.getId()==abandono),
                                        (tanteo2>tanteo1), partida.getCuartoJuego(),partida.getTiempo() );*/
                                }
                            }
                        }
                    } else {
                        if ( conf.BuscarValorConfiguracionInteger("ranking_bajada_defensa") == 1 ) {
                            // Calculamos el ranking a posteriori de forma asíncrona
                            ColaPartido cola = new ColaPartido();
                            cola.setId(partida_id);
                            cola.setFecha(Calendar.getInstance().getTime());
                            em.persist(cola);
                            log.info("[DEBUG][Actualizado Ranking" );
                        }

                        if ( conf.BuscarValorConfiguracionInteger("ranking_acumulado") == 1 ) {

                            log.error("IDENTIFICADOR 1"+ equipo1.getId() );
                            log.error("IDENTIFICADOR 2"+ equipo2.getId() );
                            // Ranking acumulado es para Tuenti
                            if ( est_partido.getTipo()==1 || est_partido.getTipo()==2 ) {
                                int puntos_acumular1= comp.puntosAcumular ( equipo1, (equipo1.getId()==abandono),
                                            (tanteo1>tanteo2 ), partida.getCuartoJuego(),partida.getTiempo() );
                                   guardaAcumulado ( em, equipo1, puntos_acumular1 );
                                /* guardaAcumulado ( em, equipo1, (equipo1.getId()==abandono),
                                        (tanteo1>tanteo2 ), partida.getCuartoJuego(),partida.getTiempo() );*/

                                int puntos_acumular2= comp.puntosAcumular ( equipo2, (equipo2.getId()==abandono),
                                    (tanteo2>tanteo1), partida.getCuartoJuego(),partida.getTiempo() );
                                guardaAcumulado ( em, equipo2, puntos_acumular2 );
                                /*guardaAcumulado ( em, equipo2, (equipo2.getId()==abandono),
                                        (tanteo2>tanteo1), partida.getCuartoJuego(),partida.getTiempo() );*/
                            }
                        }
                    }
                }

                // Gastamos las cartas y usos de ropa
                Cartas cartas = new Cartas();
                Vestidor vestidor=new Vestidor();
                if ( pve != equipo1.getId() ) {
                    cartas.ConsumirCartasPartido ( em, equipo1, p_request.getParameter("cc") );
                    vestidor.ConsumirUsosRopa(em, equipo1);
                }
                if ( pve != equipo2.getId() ) {
                    cartas.ConsumirCartasPartido ( em, equipo2, p_request.getParameter("cv") );
                    vestidor.ConsumirUsosRopa(em, equipo2);
                }

                if ( true ) {
                    Estadisticas estadisticas       = new Estadisticas( em );
                    estadisticas.setPartido( est_partido, equipo1, equipo2, exp1, exp2, abandono, maximo_hoy, pve);
                    
                    /* Guardamos las estadisticas de los jugadores de cada equipo */
                    //guardarEstJugadores ( em, p_request, estadisticas,jugadores1,jugadores2 );
                    for ( int ii=0;ii<20;ii++ ) {
                        String linea_est_jugador = null;
                        if ( ii<10)
                            linea_est_jugador = p_request.getParameter("c"+ii);
                        else
                            linea_est_jugador = p_request.getParameter("v"+(ii-10));

                        if ( linea_est_jugador != null) {
                            log.info("[DEBUG][jug]: " + linea_est_jugador );

                            MultiJugador multi =null;
                            if ( ii<10) {
                                if ( equipo1.getId() != pve )
                                    multi = estadisticas.setJugador( true, linea_est_jugador );
                            } else {
                                if ( equipo2.getId() != pve )
                                    multi = estadisticas.setJugador( false, linea_est_jugador );
                            }
                            if ( multi != null ) {
                                if ( ii<10 ) {
                                    if ( equipo1.getId() != pve ) {
                                        if ( jugadores1.length()>0 )
                                            jugadores1 += multi.jugador.getId()+"|"+multi.jugador.getNivel()+"|"+multi.jugador.getExperiencia()+"|";
                                        else
                                            jugadores1 = multi.jugador.getId()+"|"+multi.jugador.getNivel()+"|"+multi.jugador.getExperiencia()+"|";

                                        if ( multi.subida_nivel) {
                                            subida1 += multi.jugador.getId()+"|"+multi.carac_subida+"|"+ multi.puntos_subida +"|";
                                        }
                                    }
                                } else {
                                    if ( equipo2.getId() != pve ) {
                                        if ( jugadores2.length()>0 )
                                            jugadores2 += multi.jugador.getId()+"|"+multi.jugador.getNivel()+"|"+multi.jugador.getExperiencia()+"|";
                                        else
                                            jugadores2 = multi.jugador.getId()+"|"+multi.jugador.getNivel()+"|"+multi.jugador.getExperiencia()+"|";

                                        if ( multi.subida_nivel) {
                                            subida2 += multi.jugador.getId()+"|"+multi.carac_subida+"|"+ multi.puntos_subida +"|";
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if ( pve == -1) {
                        log.info(" Guardamos estadísticas 3" );
                        estadisticas.finPartido();
                    
                        /* Guardamos resultado de Weekly Ladder */
                        int valoracion1=0, valoracion2=0;
                        valoracion1= estadisticas.getEstEquipoPartidoCasa().getValoracion();
                        valoracion2= estadisticas.getEstEquipoPartidoVisita().getValoracion();

                        if ( conf.BuscarValorConfiguracionInteger("weekly_ladder") > 0 &&
                             (est_partido.getTipo()==2 || 
                              est_partido.getTipo()==5 ||
                              est_partido.getTipo()==6 )
                             ) {
                            GuardaWeeklyLadder(em,equipo1,equipo2,tanteo1,tanteo2,valoracion1,valoracion2,partida_id,maximo_hoy);
                        }
                    }
                    log.info("[DEBUG][Estadisticas Guardadas " );
                }

                /* Formato de la salida: error=xx,id=xxx,datos equipo1 ; jugadores equipo1; subidas1 ,datos equipo2 ; jugadores equipo2 ; subidas2 ,
                 *
                 * datos equipo1 = identificador | tipo de chestball | experiencia adquirida en el partido
                 *       | puntos ganados en el partido | nivel actual del equipo tras el partido
                 *       | experiencia total acumulada tras el partido
                 *       | [Premios del chestball]
                 *
                 * jugadores equipo1 = jugador1 id | jugador1 nivel | jugador1 experiencia | ... |
                 *                     jugadorN id | jugadorN nivel | jugadorN experiencia |
                 *
                 *          subidas1 = jugador1 id | carac. que sube | cuanto sube |
                 * Premios del chestball = {tipo_objeto | identificador o cantidad }
                 */

                if ( maximo_hoy == false )
                    retorno = "error=0,"+partida_id+","+equipo1.getId()+"|"+chestball1+"|"+exp1+"|"+pto1+"|"+equipo1.getNivel()+"|"+equipo1.getExperiencia();
                else
                    retorno = "error=0,"+partida_id+","+equipo1.getId()+"|0|0|0|"+equipo1.getNivel()+"|"+equipo1.getExperiencia();

                /* Preparamos los premios para los equipos */
                if ( chestball1 != 0 && maximo_hoy == false && pve != equipo1.getId() )
                    retorno+=chestBall ( em, equipo1, chestball1, obj1, carta1, puntos1, jug1, esp1, talento1 );
log.info("[DEBUG][Chestball0 correcta]: " + retorno + " subida: " + subida1);
                retorno+=";"+jugadores1;
                if ( subida1.length() > 0)
                    retorno+=";"+subida1;

log.info("[DEBUG][Chestball1 correcta]: " + retorno );
                if ( maximo_hoy == false )
                    retorno = retorno + "," +equipo2.getId()+"|"+chestball2+"|"+exp2+"|"+pto2+"|"+equipo2.getNivel()+"|"+equipo2.getExperiencia();
                else
                    retorno = retorno + "," +equipo2.getId()+"|0|0|0|"+equipo2.getNivel()+"|"+equipo2.getExperiencia();

                if ( chestball2 != 0  && maximo_hoy == false && pve != equipo2.getId())
                    retorno+=chestBall ( em, equipo2, chestball2, obj2, carta2, puntos2, jug2, esp2, talento2 );
log.info("[DEBUG][Chestball2 correcta]: " + retorno + " subida: " + subida2);
                retorno+=";"+jugadores2;
                if ( subida2.length() > 0)
                    retorno+=";"+subida2;
                retorno+=",";
            } else {
                // Partido amistoso o de PVE
                retorno = "error=0,"+partida_id+","+equipo1.getId()+"|0|0|0|"+equipo1.getNivel()+"|"+equipo1.getExperiencia();
                retorno = retorno + "," +equipo2.getId()+"|0|0|0|"+equipo2.getNivel()+"|"+equipo2.getExperiencia()+",";
            }
log.debug( retorno );
            if (em     != null && em.getTransaction().isActive() )     em.getTransaction().commit();
        } catch (ExcepcionGeneral e) {
            log.info("[DEBUG][ERROR]:" + e.getDescripion() );
            retorno = "error="+e.getCodigo()+";descripcion="+e.getDescripion();
            try { if ( em     != null && em.getTransaction().isActive() )     em.getTransaction().rollback();
            } catch (Exception e2) { }
        } catch (Exception e) {
            retorno = "error=-100";
            log.error("[DEBUG][ERROR]: ?"+ e.getMessage() );
            log.error("[DEBUG][ERROR]:", e );

            try { if ( em     != null && em.getTransaction().isActive() )     em.getTransaction().rollback();
            } catch (Exception e2) { }
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return retorno;
    }

    public String chestBall ( EntityManager em, Equipo  p_equipo, int p_tipo_chestball, int p_obj, int p_carta, int p_puntos,
                            int p_jug, int p_esp, int p_talento) throws ExcepcionGeneral {
        /* Al final del partido el servidor puede pedir una serie de premios aleatorios
         *
         *  tipo_item ( Son comos los de tienda)
         *          1-jugador
         *          2-ropa
         *          5-carta
         *        100-Dinero
         *        101-Puntos
         *        102-Experiencia
         *        103-Talento
         *  rareza 0 - No toca ni en chestballs ni en sobres
         *         1 - Comun
         *         2 - Infrecuente
         *         3 - Rara
         *         4 - Especial
         *
         *  nivel ( solo cartas) 511,512..515
         *
         */

        int     objeto_id           =0;
        int     retorno             =0;
        boolean ha_tocado_jugador   =false;
        String  slots = "";

        Integer probabilidad[] = new Integer[6];
        probabilidad[0]=p_obj;
        probabilidad[1]=p_carta     +probabilidad[0];
        probabilidad[2]=p_puntos    +probabilidad[1];
        probabilidad[3]=p_jug       +probabilidad[2];
        probabilidad[4]=p_esp       +probabilidad[3];
        probabilidad[5]=p_talento   +probabilidad[4];

        int total = probabilidad[5]; /* suma de todos los puntos de probabilidad */
log.info("[DEBUG][objeto]: "+ probabilidad[0] +
        " [carta]: "+ probabilidad[1] +
        " [puntos]: "+ probabilidad[2] +
        " [jugador]: "+ probabilidad[3] +
        " [especial]: "+ probabilidad[4] +
        " [talento]: "+ probabilidad[5] +
        " total:" + total);

        int total_objetos=0;
        switch ( p_tipo_chestball ) {
            case 1: // rubber
                total_objetos = 3;
                break;
            case 2: // Copper
                total_objetos = 4;
                break;
            case 3: // Silver
                total_objetos = 5;
                break;
            case 4: // Gold
                total_objetos = 7;
                break;
            case 5: // Black
                total_objetos = 9;
                break;
            case 6: // Celestial
                total_objetos = 12;
                break;
        }

        /* Recogemos la alineacion del equipo si el usuario ya tiene 15 jugadores
         * le damos cartas en vez de jugadores
         */
        Query q = em.createNamedQuery("Plantilla.findByEquipoId");
        q.setParameter("equipoId"   , p_equipo.getId());

        List<Plantilla> lista_plantilla = q.getResultList();
        if ( lista_plantilla.size() >= 14 ) {
            probabilidad[3]=0;
        }

        Tienda tienda= new Tienda();
        int    tipo;
        /* Elijo aleatorialmente cada uno de los objetos */
        for ( int i=0; i< total_objetos; i ++) {
            Item item   = new Item ( );
            item.setEquipo(p_equipo);
            item.setUnidades(1);
            objeto_id=-1;

            /* Hago una tirada para determinar el tipo de objeto */
            int tirada = (int)(Math.random()*total);

            if ( tirada>probabilidad[2] && tirada < probabilidad[3] ) {
                // Si ya tocó un jugador no tocan más y damos una carta
                tirada=probabilidad[0];
            }

            /* Hago una tirada para determinar la rareza del objeto */
            int tirada_rareza = RarezaAleatoria (p_tipo_chestball);
log.info("[DEBUG][TIRADA]: "+ tirada + " rareza: " + tirada_rareza );

            if ( tirada < probabilidad[0] ) { // Ropa
                tipo = 2;

                objeto_id = azarRopa    ( em, tirada_rareza, new Integer(p_equipo.getNivel()) );

log.info("[DEBUG][ROPA_ID] " + objeto_id );
                if (objeto_id != -1) {
                    item.item_id= objeto_id;

                    retorno=tienda.GuardarRopaInventario ( em, item );
                    if ( retorno != 0)
                        throw new ExcepcionGeneral( retorno, "Error al Guardar Ropa Inventario" );
                }
            }  else if ( tirada < probabilidad[1] ) { // Cartas
                tipo = 5;

                int tirada_nivel = NivelAleatorio (p_equipo.getNivel());
                objeto_id        = azarCarta   ( em, tirada_rareza, tirada_nivel );

log.info("[DEBUG][CARTA_ID] " + objeto_id );
                if (objeto_id != -1) {
                    item.item_id= objeto_id;

                    tienda.GuardarCartaInventario ( em, item );
                    if ( retorno != 0)
                        throw new ExcepcionGeneral( retorno, "Error al Guardar Ropa Inventario" );
                }
            }  else if ( tirada < probabilidad[2] ) { // Puntos
                tipo= 101;
                objeto_id = azarPuntos   ( em, p_tipo_chestball );
                if (objeto_id != -1) {
                    p_equipo.setPuntos(p_equipo.getPuntos()+ objeto_id);
                }
            }  else if ( tirada < probabilidad[3] ) { //jugador
                tipo= 1;
                if (probabilidad[3]>0) {
                    objeto_id = azarMJugador ( em, tirada_rareza, p_equipo.getId(), new Integer(p_equipo.getNivel()) );
                    if ( ha_tocado_jugador == true ) {
                        // Solo puede tocar un jugador por chestball
                        objeto_id = -1;
                    }
                    if (objeto_id != -1) {
log.info("[DEBUG][MJUGADOR1] " + item.item_id );
                        item.item_id= objeto_id;

//                        tienda.GuardarMJugadorInventario ( em, item, p_equipo,(short) 1);
                        tienda.GuardarMJugadorInventario ( em, item );
                        if ( retorno != 0)
                            throw new ExcepcionGeneral( retorno, "Error al Guardar Ropa Inventario" );

                        ha_tocado_jugador = true;
                    }
                }
            }  else if ( tirada < probabilidad[4] ) { //ESPECIAL VOLVER A TIRAR
                tipo= 104;
                objeto_id = azarEspecial ( em, tirada_rareza );
                if (objeto_id != -1) {
                    throw new ExcepcionGeneral( -20, "SIN OBJETOS ESPECIALES" );
                }
            }  else if ( tirada < probabilidad[5] ) { // Puntos de Talento
                tipo      = 103;
                objeto_id = -1;
                /* 04-06-2012 Si el equipo tiene 50 puntos o más de talento
                 * no le damos más. */
                if ( p_equipo.getCreditoTalento() <= 50 ) {
                    objeto_id = azarTalento ( em, tirada_rareza );
                    if (objeto_id != -1) {
                        p_equipo.setCreditoTalento(p_equipo.getCreditoTalento()+ objeto_id);
                    }
                } else {
                    log.info("[DEMASIADOS PUNTOS TALENTO]" + p_equipo.getCreditoTalento() );
                }
            } else {
                throw new ExcepcionGeneral( -6, "Tipo de Objeto no existe" );
            }
            if ( objeto_id == -1 )
                i--; // repetimos la tirada porque no hemos encontrado objeto de la rareza
            else
                slots = slots +  "|" + tipo + "|" + objeto_id;
        }
log.info("[DEBUG][SLOTS]: " + slots);

        return slots;
    }

    /* 26/11/2010 Restringimos el nivel de la ropa que puede tocarte en el chestball */
    public int azarRopa ( EntityManager em, Integer p_rareza, Integer p_nivel_equipo ) {
log.debug("[DEBUG][AzarRopa]: " + p_rareza + " " + p_nivel_equipo );

        /* No quitar problemas con short/int */
        short rareza=p_rareza.shortValue();
        short nivel=p_nivel_equipo.shortValue();

        Query q = em.createNamedQuery("Ropa.findByChestBall");
        q.setParameter("rareza" , rareza);
        q.setParameter("nivel"  , nivel );

        List<Ropa> lista = q.getResultList();

        if ( lista.isEmpty()) {
log.debug("[DEBUG][AZAR ROPA VACIO]" );
            return -1;
        }
        int tirada = (int)(Math.random()*lista.size()  );
        return lista.get(tirada).getId();
    }

    /* 26/11/2010 Restringimos el nivel de los jugadores que puedan tocarte en el chestball */
    public int azarMJugador ( EntityManager em, Integer p_rareza, int p_equipo_id, Integer p_nivel_equipo ) {
log.debug("[DEBUG][AzarMJugador]: " + p_rareza + " equipo " + p_equipo_id + " " + p_nivel_equipo );

        /* No quitar problemas con short/int */
        short rareza=p_rareza.shortValue();
        short nivel =p_nivel_equipo.shortValue();

//        Query q = em.createNativeQuery("SELECT m.* FROM basket.MJugador m, Plantilla p where m.rareza = ? and p.equipo_id = ? and p.m_jugador_id != m.id " );
        Query q = em.createNativeQuery("SELECT m.* FROM basket.m_jugador m where m.rareza = :rareza and m.nivel<= :nivel and (estado=1 or estado=2) and m.id not in ( select m_jugador_id from basket.jugador where equipo_id= :equipo_id)", MJugador.class );
        q.setParameter("rareza" , rareza);
        q.setParameter("nivel"  , nivel );
        q.setParameter("equipo_id"  , p_equipo_id);

log.debug("[DEBUG][PARAMETROS]: " + rareza + " equipo " + p_equipo_id + " " + nivel );

        List<MJugador> lista = q.getResultList();
        if ( lista.isEmpty()) {
log.debug("[DEBUG][NO HAY JUGADORES CHESTBALL]" );
            return -1;
        }
        int tirada = (int)(Math.random()*lista.size()  );

        return lista.get(tirada).getId();
    }

    public int azarCarta ( EntityManager em, int p_rareza, int p_nivel ) {
log.debug("[DEBUG][AzarCarta]: " + p_rareza + " nivel " + p_nivel);

        Query q = em.createNamedQuery("Carta.findByChestBall");
        q.setParameter("rareza", p_rareza);
        q.setParameter("nivel",  p_nivel);

        List<Carta> lista = q.getResultList();
        if ( lista.isEmpty()) {
log.debug("[DEBUG][NO HAY CARTAS de rareza]: " + p_rareza + "nivel" + p_nivel);
            return -1;
        }
        int tirada = (int)(Math.random()*lista.size()  );

log.debug("[DEBUG][traza id]: " + lista.get(tirada).getId());
        return lista.get(tirada).getId();
    }

    public int azarTalento ( EntityManager em, int p_rareza ) {
log.debug("[DEBUG][azarTalento]: " + p_rareza );

        /* Devuelve el número de puntos de talento que le han tocado */
        return 1;
    }

    public int azarPuntos ( EntityManager em, int p_tipo_chestball ) throws ExcepcionGeneral {
        /* Devuelve el número de puntos de talento que le han tocado */
        int puntos=0;
        int tirada = (int)(Math.random()*100);
log.debug("[DEBUG][AzarPuntos]: " + p_tipo_chestball + " tirada " + tirada);
        switch ( p_tipo_chestball ) {
            case 1: // rubber
                if ( tirada <= 60 ) {
                    puntos = 100;
                }  else if ( tirada <= 80 ) {
                    puntos = 200;
                }  else if ( tirada <= 95 ) {
                    puntos = 400;
                } else {
                    puntos = 800;
                }
                break;
            case 2: // Copper
                if ( tirada <= 60 ) {
                    puntos = 200;
                }  else if ( tirada <= 80 ) {
                    puntos = 400;
                }  else if ( tirada <= 95 ) {
                    puntos = 800;
                } else {
                    puntos = 1600;
                }
                break;
            case 3: // Silver
                if ( tirada <= 60 ) {
                    puntos = 400;
                }  else if ( tirada <= 80 ) {
                    puntos = 800;
                }  else if ( tirada <= 95 ) {
                    puntos = 1600;
                } else {
                    puntos = 3200;
                }
                break;
            case 4: // Gold
                if ( tirada <= 60 ) {
                    puntos = 1200;
                }  else if ( tirada <= 80 ) {
                    puntos = 2400;
                }  else if ( tirada <= 95 ) {
                    puntos = 4800;
                } else {
                    puntos = 9600;
                }
                break;
            case 5: // Black
                if ( tirada <= 60 ) {
                    puntos = 2400;
                }  else if ( tirada <= 80 ) {
                    puntos = 4800;
                }  else if ( tirada <= 95 ) {
                    puntos = 9600;
                } else {
                    puntos = 19200;
                }
                break;
            case 6: // Celestial
                throw new ExcepcionGeneral( -8, "Tipo ChestBall no definido" );
            default:
                throw new ExcepcionGeneral( -9, "Tipo ChestBall no existe" );
        }
        return puntos*3;
    }

    public int azarEspecial ( EntityManager em, int p_rareza) {
log.debug("[DEBUG][AzarEspecial]: " + p_rareza);
        return -1;
    }

    public int RarezaAleatoria ( int p_tipo_chestball ) {
        int rareza = 0;
        int tirada = (int)(Math.random()*100)+1;

        switch ( p_tipo_chestball ) {
            case 1: // rubber
                if ( tirada < 50 ) {
                    rareza = 1;
                } else if (tirada < 80) {
                    rareza = 2;
                } else {
                    rareza = 3;
                }
                break;
            case 2: // Copper
                if ( tirada < 45 ) {
                    rareza = 1;
                } else if (tirada < 80) {
                    rareza = 2;
                } else {
                    rareza = 3;
                }
                break;
            case 3: // Silver
                if ( tirada < 45 ) {
                    rareza = 1;
                } else if (tirada < 75) {
                    rareza = 2;
                } else if (tirada < 95) {
                    rareza = 3;
                } else {
                    rareza = 4;
                }
                break;
            case 4: // Gold
                if ( tirada < 40 ) {
                    rareza = 1;
                } else if (tirada < 70) {
                    rareza = 2;
                } else if (tirada < 95) {
                    rareza = 3;
                } else {
                    rareza = 4;
                }
                break;
            case 5: // Black
                if ( tirada < 35 ) {
                    rareza = 1;
                } else if (tirada < 70) {
                    rareza = 2;
                } else if (tirada < 95) {
                    rareza = 3;
                } else {
                    rareza = 4;
                }
                break;
            case 6: // Celestial
                rareza = 3;
                break;

        }
        return rareza;
    }
    
/*
    public int NivelAleatorioJugador ( int  p_nivel_equipo) throws ExcepcionGeneral {
        int nivel  = 0;
        int tirada = (int)(Math.random()*100)+1;

        if ( p_nivel_equipo <=15) {
            if ( tirada <= 46 ) {
                nivel = 1;
            }  else if ( tirada <= 72 ) {
                nivel = 2;
            }  else if ( tirada <= 88 ) {
                nivel = 3;
            }  else if ( tirada <= 99 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else if ( p_nivel_equipo <=30 ) {
            if ( tirada <= 36 ) {
                nivel = 1;
            }  else if ( tirada <= 66 ) {
                nivel = 2;
            }  else if ( tirada <= 86 ) {
                nivel = 3;
            }  else if ( tirada <= 97 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else if ( p_nivel_equipo <=40 ) {
            if ( tirada <= 30 ) {
                nivel = 1;
            }  else if ( tirada <= 55 ) {
                nivel = 2;
            }  else if ( tirada <= 80 ) {
                nivel = 3;
            }  else if ( tirada <= 95 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else if ( p_nivel_equipo <=50 ) {
            if ( tirada <= 25 ) {
                nivel = 1;
            }  else if ( tirada <= 50 ) {
                nivel = 2;
            }  else if ( tirada <= 75 ) {
                nivel = 3;
            }  else if ( tirada <= 90 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else  {
            if ( tirada <= 20 ) {
                nivel = 1;
            }  else if ( tirada <= 45 ) {
                nivel = 2;
            }  else if ( tirada <= 70 ) {
                nivel = 3;
            }  else if ( tirada <= 85 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        }
log.debug("[DEBUG][RarezaCarta]: " + p_nivel_equipo + " tirada:"+tirada + " nivel carta:" + nivel);
        return 510+nivel;
    }
*/

    /*
     * Las cartas de nivel más alto pueden proporcionarse a equipos de nivel
     * inferior
     */
    public int NivelAleatorio ( int  p_nivel_equipo) throws ExcepcionGeneral {
        int nivel  = 0;
        int tirada = (int)(Math.random()*100)+1;

        if ( p_nivel_equipo <=15) {
            if ( tirada <= 46 ) {
                nivel = 1;
            }  else if ( tirada <= 72 ) {
                nivel = 2;
            }  else if ( tirada <= 88 ) {
                nivel = 3;
            }  else if ( tirada <= 99 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else if ( p_nivel_equipo <=30 ) {
            if ( tirada <= 36 ) {
                nivel = 1;
            }  else if ( tirada <= 66 ) {
                nivel = 2;
            }  else if ( tirada <= 86 ) {
                nivel = 3;
            }  else if ( tirada <= 97 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else if ( p_nivel_equipo <=40 ) {
            if ( tirada <= 30 ) {
                nivel = 1;
            }  else if ( tirada <= 55 ) {
                nivel = 2;
            }  else if ( tirada <= 80 ) {
                nivel = 3;
            }  else if ( tirada <= 95 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else if ( p_nivel_equipo <=50 ) {
            if ( tirada <= 25 ) {
                nivel = 1;
            }  else if ( tirada <= 50 ) {
                nivel = 2;
            }  else if ( tirada <= 75 ) {
                nivel = 3;
            }  else if ( tirada <= 90 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        } else  {
            if ( tirada <= 20 ) {
                nivel = 1;
            }  else if ( tirada <= 45 ) {
                nivel = 2;
            }  else if ( tirada <= 70 ) {
                nivel = 3;
            }  else if ( tirada <= 85 ) {
                nivel = 4;
            }  else if ( tirada <= 100 ){
                nivel = 5;
            } else {
                throw new ExcepcionGeneral( -7, "Probabilidad Imposible" );
            }
        }
log.debug("[DEBUG][RarezaCarta]: " + p_nivel_equipo + " tirada:"+tirada + " nivel carta:" + nivel);
        return 510+nivel;
    }

    public int extractIntParameter( String p_nombre, HttpServletRequest p_request)  throws ExcepcionGeneral {
        if ( p_request.getParameter(p_nombre) != null)
            return Integer.parseInt(p_request.getParameter(p_nombre));
        else
            throw new ExcepcionGeneral( -2, "extractIntParameter: Parametro " + p_nombre + " Incorrecto"  );

    }

    public int extractNvlIntParameter( String p_nombre, HttpServletRequest p_request, int p_defecto)  throws ExcepcionGeneral {
        /* Si no encuentra el parametro devuelve el valor por defecto */

        if ( p_request.getParameter(p_nombre) != null) {
            return Integer.parseInt(p_request.getParameter(p_nombre));
        } else {
            return p_defecto;
        }
    }

    public short nuevoNivel( int p_experiencia, short p_nivel ) {
        //int puntos_nivel = (int)((Math.pow(p_nivel-1,3) + 3*Math.pow(p_nivel-1,2) + 26*(p_nivel-1)+24) * (125/3));
        int     puntos_siguiente_nivel  = 0;
        short   nuevo_nivel             = p_nivel;

        do {
            //puntos_siguiente_nivel = (nuevo_nivel*1000) + ((nuevo_nivel -1) * nuevo_nivel * (nuevo_nivel + 1) * 125 / 3);

            puntos_siguiente_nivel = experienciaBaseNivel(nuevo_nivel);

            if ( puntos_siguiente_nivel <= p_experiencia ) {
log.debug("[SIGUIENTE NIVEL][Nivel]: " + p_nivel + " " +1 + " experiencia actual" + p_experiencia + " esp. siguiente nivel " + puntos_siguiente_nivel);
                nuevo_nivel++;
            }
        } while ( puntos_siguiente_nivel <= p_experiencia );
        return nuevo_nivel;
    }

    public int experienciaBaseNivel( int p_nivel){
            return (p_nivel*1000) + ((p_nivel -1) * p_nivel * (p_nivel + 1) * 125 / 3);
    }

    public void wsGrabarMazo(HttpServletRequest p_request, HttpServletResponse p_response) {
        LoginAction                 login   = null;
        EntityManager               em      = null;
        String                      output  = "";
        Tienda                      tienda  = new Tienda();
        Cartas                      cartas  = new Cartas();
        Hashtable <Integer,Integer> cartas_cantidad = new Hashtable();

        // Parámetros de entrada
        int idEquipo = 0;
        int idUsuario= 0;
        try {
            idEquipo = Integer.parseInt(p_request.getParameter("idEquipo"));
            em = emfBasket.createEntityManager(); // check 07.08.2012

            Equipo equipo = (Equipo)em.find(Equipo.class, idEquipo);
            em.getTransaction().begin();

            Query q_mazo = em.createNamedQuery("Mazo.findByEquipoId");
            q_mazo.setParameter("equipoId", idEquipo);

            List<Mazo> lista_mazo = q_mazo.getResultList();
            if (lista_mazo.isEmpty()==false) {
                // Primero vaciamos el mazo
                for ( int i=0;i< lista_mazo.size(); i++) {
                    int carta_quitar_id = lista_mazo.get(i).getCarta().getId();

                    // Añadimos a CartaEquipo (Inventario)
                    //tienda.PasarCartaMazoInventario(em, lista_mazo.get(i));
                    em.remove(lista_mazo.get(i));
                }

            }

log.debug("[vaciado]=====" );
            // Comprobamos cada parametro q1..4_1..3
            // la primera parte es el cuarto y la segunda parte es el nº de slot
            int [] ocupado = new int[5];

            for ( int cuarto=1;cuarto<=4;cuarto++) {
                for ( int slot=1;slot<=3;slot++) {
                    int carta_id = extractNvlIntParameter ( "slot_q"+cuarto+"_"+slot, p_request, 0 );

                    // comprobamos su duración si cabe o no
                    if ( carta_id > 0  ) {
                        if ( ocupado[cuarto] >= 3) {
                            throw new ExcepcionGeneral( -3, "Carta no cabe " + carta_id + "cuarto "+ cuarto +" slot " + slot + " ocupados");
                        }
                        int cuartos_ocupacion = cartas.ColocarCarta ( em, equipo, cuarto, slot, carta_id  );

                        for ( int a=cuarto;a<=cuarto+cuartos_ocupacion-1 && a<=4;a++)
                            ocupado[a]++;
log.debug(" ocupacion 1:" + ocupado[1] +" 2:" + ocupado[2]+" 3:" + ocupado[3] + " 4:" + ocupado[4] );

                        if ( cartas_cantidad.containsKey(carta_id) ) {

log.debug(" EXISTE CARTA:" + carta_id + " CANTIDAD " + cartas_cantidad.get(carta_id) );

                            cartas_cantidad.put(carta_id, cartas_cantidad.get(carta_id)+1);
                        } else {
                            cartas_cantidad.put(carta_id, 1);
                        }
                    }
                }
            }
log.debug(" FINAL  1:" + ocupado[1] +" 2:" + ocupado[2]+" 3:" + ocupado[3] + " 4:" + ocupado[4] );

            // Compruebo si hay inventario suficiente
            Enumeration e = cartas_cantidad.keys();
            while(e.hasMoreElements()) {
                Integer key = (Integer)e.nextElement();
                int value = cartas_cantidad.get(key);

                Query q2 = em.createNamedQuery("CartaEquipo.findByEquipoIdCartaId");
                q2.setParameter("equipoId", idEquipo);
                q2.setParameter("cartaId", key);

                List<CartaEquipo> lista_carta_equipo = q2.getResultList();
                if ( lista_carta_equipo.isEmpty() == true || lista_carta_equipo.get(0).getCantidad()< value )
                    throw new ExcepcionGeneral( -4, "Insuficientes Unidades" + key + " cuantas" + value + " inventario" );
log.debug("[clave]=====" + key + " cuantos " + value + " inventario " + lista_carta_equipo.get(0).getCantidad() );
            }

            em.getTransaction().commit();
log.debug("[fin]=====" );
            output="error=0";
        } catch (ExcepcionGeneral e) {
            output = "error="+e.getCodigo()+";descripcion="+e.getDescripion();
            try { if ( em     != null && em.getTransaction().isActive() )     em.getTransaction().rollback(); } catch (Exception exc) { }
        } catch (Exception ex) {
            output = "error=-1";
            log.error("Error general", ex);
            if (em != null && em.getTransaction().isActive() ) {
                em.getTransaction().rollback();
            }
        } finally {
            try { p_response.getWriter().print(output); } catch (Exception exc) { };
            try { if (em.getTransaction().isActive()) { em.getTransaction().commit(); } } catch (Exception exc) { }
            try { em.close(); } catch (Exception exc) { } // revisado 09/08/2012
        }

    }



    public int ComprobarEquipoSesion (EntityManager em, String p_sesion, int p_equipo) {
        LoginAction login       = new LoginAction();

        int usuario_id = login.comprobarSesion(p_sesion, em);

        Query q = em.createNamedQuery("Equipo.findById");
        q.setParameter("idEquipo", p_equipo);

        List<Equipo> lista_equipo = q.getResultList();

        if (lista_equipo.isEmpty()) {
            log.debug("Sesión de Equipo incorrecta "+ p_equipo + " " + p_sesion);
            return -1;
        }
        if ( lista_equipo.get(0).getUsuario().getId() != usuario_id ) {
            log.debug("Sesión de otro Usuario equipo:"+ p_equipo + " usuario_id:" + lista_equipo.get(0).getUsuario().getId());
            return -2;
        } else {
            return p_equipo;
        }
    }

    public boolean aumentaExpJugador ( EntityManager em, MultiJugador multi, int p_experiencia) throws ExcepcionGeneral {
        // Aumenta la experiencia de un jugador
        // Sube de nivel al jugador si llega al limite de experiencia de su nivel actual
        // Si hay subida de nivel: 
        //      subida_nivel pasa a true.
        //      carac_subida toma el valor de la características que sube
        //      puntos_subida toma el valor en puntos que sube la característica.

        int factor = conf.BuscarValorConfiguracionInteger("factor_experiencia_equipo");
        int valor = p_experiencia * factor;
log.debug("exp antes "+p_experiencia+"factor"+valor);
        Jugador jugador = multi.jugador;

        int antiguo_nivel = jugador.getNivel();
        log.debug(" Antiguo Nivel " + antiguo_nivel + " exp:" + jugador.getExperiencia() );

        jugador.setExperiencia(jugador.getExperiencia() + valor);
        // Utilizamos la formula de cambio de nivel del equipo
        jugador.setNivel((short)nuevoNivel( jugador.getExperiencia(),
                nuevoNivel( jugador.getExperiencia(), jugador.getNivel()) ) );

        log.debug(" Nuevo Nivel " + jugador.getNivel() + " exp:" + jugador.getExperiencia() );
        if ( antiguo_nivel != jugador.getNivel()) {
            multi.subida_nivel = true;
            jugadorSubeNivel( em, multi );
            return true;
        }
        return false;
    }

    public void jugadorSubeNivel ( EntityManager em, MultiJugador p_multi ) throws ExcepcionGeneral{
        int     error;
        int     veces=0;
        boolean falta_subir=true;

        while ( veces < 100 && falta_subir) {
            veces++;

            /* Elegir una propiedad aleatoriamente */
            int propiedad = (int)(Math.random()*15)+1;
            p_multi.carac_subida = propiedad;

            /* Elegimos la cantidad a subir dicha propiedad el mínimo es uno*/
            int cantidad  = (int)(Math.random()*10)+1;
            switch (cantidad) {
                case 1:
                case 2:
                    cantidad=1;
                    break;
                case 3:
                case 4:
                case 5:
                    cantidad=2;
                    break;
                case 6:
                case 7:
                case 8:
                    cantidad=3;
                    break;
                case 9:
                    cantidad=4;
                    break;
                case 10:
                case 11:
                    cantidad=5;
                    break;
            }
            p_multi.puntos_subida = cantidad;

    log.debug("[JUGADOR SUBE NIVEL] id:"+ p_multi.jugador.getId()+ " propiedad " + propiedad + " cantidad " + cantidad );

            /* Aumentamos la propiedad base */
            switch ( propiedad ) {
                case 1:
                    if ( (short)(cantidad + p_multi.jugador.getBT2())<=100  ) {
                        p_multi.jugador.setBT2             (   (short)(cantidad + p_multi.jugador.getBT2          ()) );
                        falta_subir=false;
                    }
                    break;
                case 2:
                    if ( (short)(cantidad + p_multi.jugador.getBT3())<=100  ) {
                        p_multi.jugador.setBT3             (  (short)( cantidad + p_multi.jugador.getBT3           ()) );
                        falta_subir=false;
                    }
                    break;
                case 3:
                    if ( (short)(cantidad + p_multi.jugador.getBT1())<=100  ) {
                        p_multi.jugador.setBT1             (  (short)( cantidad + p_multi.jugador.getBT1           ()) );
                        falta_subir=false;
                    }
                    break;
                case 4:
                    if ( (short)(cantidad + p_multi.jugador.getBAgresividad())<=100  ) {
                        p_multi.jugador.setBAgresividad    (  (short)( cantidad + p_multi.jugador.getBAgresividad  ()) );
                        falta_subir=false;
                    }
                    break;
                case 5:
                    if ( (short)(cantidad + p_multi.jugador.getBDriblin())<=100  ) {
                        p_multi.jugador.setBDriblin        (  (short)( cantidad + p_multi.jugador.getBDriblin      ()) );
                        falta_subir=false;
                    }
                    break;
                case 6:
                    if ( (short)(cantidad + p_multi.jugador.getBPase())<=100  ) {
                        p_multi.jugador.setBPase           (  (short)( cantidad + p_multi.jugador.getBPase         ()) );
                        falta_subir=false;
                    }
                    break;
                case 7:
                    if ( (short)(cantidad + p_multi.jugador.getBReboteAtaque())<=100  ) {
                        p_multi.jugador.setBReboteAtaque   (  (short)( cantidad + p_multi.jugador.getBReboteAtaque ()) );
                        falta_subir=false;
                    }
                    break;
                case 8:
                    if ( (short)(cantidad + p_multi.jugador.getBReboteDefensa())<=100  ) {
                        p_multi.jugador.setBReboteDefensa  (  (short)( cantidad + p_multi.jugador.getBReboteDefensa()) );
                        falta_subir=false;
                    }
                    break;
                case 9:
                    if ( (short)(cantidad + p_multi.jugador.getBRobo())<=100  ) {
                        p_multi.jugador.setBRobo           (  (short)( cantidad + p_multi.jugador.getBRobo         ()) );
                        falta_subir=false;
                    }
                    break;
                case 10:
                    if ( (short)(cantidad + p_multi.jugador.getBTapon())<=100  ) {
                        p_multi.jugador.setBTapon          (  (short)( cantidad + p_multi.jugador.getBTapon        ()) );
                        falta_subir=false;
                    }
                    break;
                case 11:
                    if ( (short)(cantidad + p_multi.jugador.getBDefensa())<=100  ) {
                        p_multi.jugador.setBDefensa        (  (short)( cantidad + p_multi.jugador.getBDefensa      ()) );
                        falta_subir=false;
                    }
                    break;
                case 12:
                    if ( (short)(cantidad + p_multi.jugador.getBResistencia())<=100  ) {
                        p_multi.jugador.setBResistencia    (  (short)( cantidad + p_multi.jugador.getBResistencia  ()) );
                        falta_subir=false;
                    }
                    break;
                case 13:
                    if ( (short)(cantidad + p_multi.jugador.getBVelocidad())<=100  ) {
                        p_multi.jugador.setBVelocidad      (  (short)( cantidad + p_multi.jugador.getBVelocidad    ()) );
                        falta_subir=false;
                    }
                    break;
                case 14:
                    if ( (short)(cantidad + p_multi.jugador.getBSprint())<=100  ) {
                        p_multi.jugador.setBSprint         (  (short)( cantidad + p_multi.jugador.getBSprint       ()) );
                        falta_subir=false;
                    }
                    break;
                case 15:
                case 16:
                    if ( (short)(cantidad + p_multi.jugador.getBTeamwork())<=100  ) {
                        p_multi.jugador.setBTeamwork       (  (short)( cantidad + p_multi.jugador.getBTeamwork     ()) );
                        falta_subir=false;
                    }
                    break;
                default:
                    log.error("NO EXISTE LA PROPIEDAD A SUBIR "+ propiedad );

            }
        }
        if ( falta_subir==true)
            p_multi.puntos_subida = 0;

        /* Volvemos a vestir al jugador para que recalcule las nuevas características */
        Vestidor vestidor = new Vestidor();
        error = vestidor.calcularRopaJugador ( em, p_multi.jugador );
        if ( error != 0)
            log.error("ERROR AL RECALCULAR ROPA "+error );

        vestidor.calcularPowerPlay ( em, p_multi.jugador.getEquipo() );

    }

    public Semanal buscarSemanal( EntityManager em, int equipo_id) {
        try {
            /* Buscamos el weekly ladder de los contendientes */
            Query q_semanal = em.createNamedQuery("Semanal.findByEquipoId");
            q_semanal.setParameter("id", equipo_id );

            Semanal semanal = (Semanal)q_semanal.getSingleResult();
            return semanal;
        } catch (NoResultException nre) {
            log.info("[TRAZA][Semanal no encontrado]: " + equipo_id );
            return null;
        } catch (Exception e) {
            log.error("[ERROR][Al buscar semanal]: " , e);
            return null;
        }

    }

    private void guardaAcumulado( EntityManager p_em, Equipo p_equipo, int puntos ) {

        // Calcula y guarda los puntos que se lleva el equipo para guardarlos
        // en el ranking acumulado de los últimos 7 dias.
        if ( conf.BuscarValorConfiguracionInteger("wbcstar") == 1 ) {
            Acumuladowbc acumuladowbc = buscarAcumuladowbcMayor( p_em, p_equipo.getId() );

           // Si no existe el registro acumulado para el equipo
           // o el registro es de una categoria inferior a la actual para el equipo
           if (  acumuladowbc == null ||
                (acumuladowbc != null && Util.getCategoriaEquipo ( p_equipo ) != acumuladowbc.getCategoria() )
                    ) {            
                acumuladowbc = new Acumuladowbc();
                acumuladowbc.setEquipoId ( p_equipo.getId() );
                acumuladowbc.setCategoria( Util.getCategoriaEquipo ( p_equipo ) );                
                acumuladowbc.setZonaId   ( p_equipo.getZonaId() );                

                acumuladowbc.setS1(puntos);
                acumuladowbc.setS2(0);
                acumuladowbc.setS3(0);
                acumuladowbc.setS4(0);
                acumuladowbc.setS5(0);
                acumuladowbc.setS6(0);
                acumuladowbc.setS7(0);

                acumuladowbc.setJugados( acumuladowbc.getJugados()+1 );
                acumuladowbc.setfUltimo(new Date());

                 p_em.persist(acumuladowbc);
            } else {
                acumuladowbc.setS1(acumuladowbc.getS1()+puntos);
                // Arreglado el 07-03-2013
                acumuladowbc.setJugados( acumuladowbc.getJugados()+1 );
                // Arreglado el 07-03-2013
                // Arreglado el 25-04-2013
                acumuladowbc.setfUltimo(new Date());
                // Arreglado el 25-04-2013
           }
        } else {
            // Solo TUENTI
            Acumulado acumulado = buscarAcumulado( p_em, p_equipo.getId() );
            if ( acumulado == null) {            
                acumulado = new Acumulado();
                acumulado.setId( p_equipo.getId() );
                acumulado.setS1(puntos);
                acumulado.setS2(0);
                acumulado.setS3(0);
                acumulado.setS4(0);
                acumulado.setS5(0);
                acumulado.setS6(0);
                acumulado.setS7(0);
                p_em.persist(acumulado);
            }
        }

/* ANTIGUO 30/01/2012
        if ( puntos != 0 ) {
            Acumulado acumulado = buscarAcumulado( p_em, p_equipo.getId() );
            if ( acumulado == null) {
                acumulado = new Acumulado();
                acumulado.setId( p_equipo.getId() );
                acumulado.setS1(puntos);
                acumulado.setS2(0);
                acumulado.setS3(0);
                acumulado.setS4(0);
                acumulado.setS5(0);
                acumulado.setS6(0);
                acumulado.setS7(0);

                if ( conf.BuscarValorConfiguracionInteger("wbcstar") == 1 ) {
                    acumulado.setCategoria( Util.getCategoriaEquipo ( p_equipo ) );
                } else {
                    acumulado.setCategoria( 0 );
                }

                p_em.persist(acumulado);
            } else {
                acumulado.setS1(acumulado.getS1()+puntos);
                acumulado.setCategoria( Util.getCategoriaEquipo ( p_equipo ) );
            }
        }
*/
    }

    public Acumulado buscarAcumulado( EntityManager p_em, int p_equipo_id) {
        try {
            // Buscamos el ranking acumulado de un equipo
            Query q_acumulado = p_em.createNamedQuery("Acumulado.findById");
            q_acumulado.setParameter("id", p_equipo_id );

            Acumulado acumulado = (Acumulado)q_acumulado.getSingleResult();
            return acumulado;
        } catch (NoResultException nre) {
            log.info("[TRAZA][Acumulado no encontrado]: " + p_equipo_id );
            return null;
        } 
    }

    public List<Acumuladowbc> buscarAcumuladowbc( EntityManager p_em, int p_equipo_id) {
        try {
            // Buscamos todos los rankings acumulados de un equipo de todas sus categorias
            Query q_acumulado = p_em.createNamedQuery("Acumuladowbc.findByEquipoId");
            q_acumulado.setParameter("equipo_id", p_equipo_id );
            
            List<Acumuladowbc> lista_acumuladowbc = q_acumulado.getResultList();            
            
            return lista_acumuladowbc;
        } catch (NoResultException nre) {
            log.info("[TRAZA][Acumuladowbc no encontrado]: " + p_equipo_id );
            return null;
        } 
    }

    public Acumuladowbc buscarAcumuladowbcMayor( EntityManager p_em, int p_equipo_id) {
        try {
            // Buscamos el ranking acumulado de un equipo de su categoria más alta
            Query q_acumulado = p_em.createNamedQuery("Acumuladowbc.findByEquipoId");
            q_acumulado.setParameter("equipo_id", p_equipo_id );
            
            List<Acumuladowbc> lista_acumuladowbc = q_acumulado.getResultList();            
            
            if ( lista_acumuladowbc.size()>0 )
                return lista_acumuladowbc.get(0);
            else 
                return null;
        } catch (NoResultException nre) {
            log.info("[TRAZA][Acumuladowbc no encontrado]: " + p_equipo_id );
            return null;
        } 
    }
    
    
    private int GuardaWeeklyLadder( EntityManager em, Equipo equipo1, Equipo equipo2,
            int tanteo1, int tanteo2, int valoracion1, int valoracion2, int partido_id,
            boolean maximo_hoy){

            /* Comprobamos si el partido está dentro de la ventana de cambio
             * del nuevo ranking
             */
            java.util.Calendar fecha = java.util.Calendar.getInstance();
            if ( fecha.get(java.util.Calendar.DAY_OF_WEEK) == java.util.Calendar.MONDAY )
            {
                if ( fecha.get(java.util.Calendar.HOUR_OF_DAY)>= 0 &&
                     fecha.get(java.util.Calendar.HOUR_OF_DAY) < 6 ) {
log.info("[SEMANAL][No ha empezado la competición "+ java.util.Calendar.DAY_OF_WEEK + " " + java.util.Calendar.HOUR_OF_DAY );
                    return 0;
                }
            }

            Date f_alta = new Date();

            Semanal semanal1 = buscarSemanal( em, equipo1.getId() );
            Semanal semanal2 = buscarSemanal( em, equipo2.getId() );

            int pto_semanal1 = 0;
            int pto_semanal2 = 0;

            int handicap = Math.abs( equipo1.getNivel() - equipo2.getNivel() );
            if ( handicap < 3)
                handicap=0;

            int misma_division=0;
            if ( semanal1!= null && semanal2!= null &&
                 semanal1.getTorneoId() == semanal2.getTorneoId() &&
                 semanal1.getDivision() == semanal2.getDivision()
                ) {
                misma_division+=10;
            }

            /* Comprobamos si ha jugado hoy 3 veces con el mismo rival.
             * De la cuarta vez en adelante solo vale si están en el mismo grupo.
             */
            if ( misma_division == 0 && maximo_hoy == true ){
log.info("[SEMANAL][Maximo diario con el mismo equipo sobrepasado y distinto grupo"   );
                return 0;
            }

            if ( tanteo1 > tanteo2) {
                if ( semanal1 != null) {
log.info("[SEMANAL][Antes] gano equipo1 "+semanal1.getPuntos()  );
                    semanal1.setPartidos(semanal1.getPartidos()+1);

                    pto_semanal1 = CalculaPuntosSemanal( true, misma_division,semanal1.getPartidos(),valoracion1,handicap );
//                  pto_semanal1 = (30+misma_division)/semanal1.getPartidos() + (valoracion1/10) + handicap;
                    semanal1.setPuntos(semanal1.getPuntos()+pto_semanal1);
                    em.persist(semanal1);
log.info("[SEMANAL][Semanal Grabar] equipo1 "+semanal1.getEquipoId()+" j "+semanal1.getPartidos()+
        " p "+semanal1.getPuntos()+ " m "+misma_division+ " v "+valoracion1+" h " + handicap  );
                    PuntosSemanal puntos1 = new PuntosSemanal(f_alta,equipo1.getId(),semanal1.getPartidos(),pto_semanal1,partido_id);
                    em.persist(puntos1);
                }
                if ( semanal2 != null) {
log.info("[SEMANAL][Antes] pierde equipo2 "+semanal2.getPuntos()  );
                    semanal2.setPartidos(semanal2.getPartidos()+1);

                    pto_semanal2 = CalculaPuntosSemanal( false, misma_division,semanal2.getPartidos(),valoracion2,handicap );
//                  pto_semanal2 = (10+misma_division)/semanal2.getPartidos() ;
                    semanal2.setPuntos(semanal2.getPuntos()+pto_semanal2);
                    em.persist(semanal2);
log.info("[SEMANAL][Semanal Grabar] equipo2 "+semanal2.getEquipoId()+" j "+semanal2.getPartidos()+" p "+semanal2.getPuntos()  );
                    PuntosSemanal puntos = new PuntosSemanal(f_alta,equipo2.getId(),semanal2.getPartidos(),pto_semanal2,partido_id);
                    em.persist(puntos);
                }
            } else {
                if ( semanal2 != null) {
log.info("[SEMANAL][Antes] gano equipo2 "+semanal2.getPuntos()  );
                    semanal2.setPartidos(semanal2.getPartidos()+1);
//                  pto_semanal2 = (30+misma_division)/semanal2.getPartidos() + (valoracion2/10) + handicap;
                    pto_semanal2 = CalculaPuntosSemanal( true, misma_division,semanal2.getPartidos(),valoracion2,handicap );
                    semanal2.setPuntos(semanal2.getPuntos()+pto_semanal2);
                    em.persist(semanal2);
log.info("[SEMANAL][Semanal Grabar] equipo2 "+semanal2.getEquipoId()+" j "+semanal2.getPartidos()+
        " p "+semanal2.getPuntos()+ " m "+misma_division+ " v "+valoracion2+" h " + handicap  );
                    PuntosSemanal puntos = new PuntosSemanal(f_alta,equipo2.getId(),semanal2.getPartidos(),pto_semanal2,partido_id);
                    em.persist(puntos);
                }
                if ( semanal1 != null) {
log.info("[SEMANAL][Antes] pierde equipo1 "+semanal1.getPuntos()  );
                    semanal1.setPartidos(semanal1.getPartidos()+1);
//                  pto_semanal1 = (10+misma_division)/semanal1.getPartidos() ;
                    pto_semanal1 = CalculaPuntosSemanal( false, misma_division,semanal1.getPartidos(),valoracion1,handicap );
                    semanal1.setPuntos(semanal1.getPuntos()+pto_semanal1);
                    em.persist(semanal1);
log.info("[SEMANAL][Semanal Grabar] equipo1 "+semanal1.getEquipoId()+" j "+semanal1.getPartidos()+" p "+semanal1.getPuntos()  );
                    PuntosSemanal puntos = new PuntosSemanal(f_alta,equipo1.getId(),semanal1.getPartidos(),pto_semanal1,partido_id);
                    em.persist(puntos);
                }
            }
            return 0;
    }

    private int CalculaPuntosSemanal( boolean ganador, int misma_division, int partidos, int valoracion1,int handicap ){

        int puntos;

        if ( ganador ) {
            puntos = Math.round((float)(30+misma_division)/(float)partidos + (float)((float)valoracion1/(float)10) + (float)handicap);
        } else {
            puntos = Math.round((float)(10+misma_division)/(float)partidos  );
        }
        return puntos;

    }

    public int ActualizarReputacion ( Equipo eq, int p_tipo_partido) {
        int castigo = 0;
        int reputacion = eq.getUsuario().getReputacion();

        if ( reputacion > 89 )
            castigo = -5;
        else if ( reputacion > 69 )
            castigo = -8;
        else
            castigo = -10;

        if ( p_tipo_partido == 6) {
            castigo = castigo*3;
        }
        
        eq.getUsuario().setReputacion( reputacion + castigo );

        return 0;
    }

    public int guardaBug(HttpServletRequest request, HttpServletResponse response) {

        EntityManager   em      = null;
        XMLOutputter    out     = null;
        Document        doc     = null;
        int             error   = 0;

        try {
            String par1 = request.getParameter("par1");
            String par2 = request.getParameter("par2");

            log.error("[BUG]>  " );
            log.error("[BUG]> " + par1);
            log.error("[BUG]> -------------------- " );
            log.error("[BUG]> " + par2);
            log.error("[BUG]> -------------------- " );
            
        } catch (Exception e) {
            log.error("[ERROR][constructor]: No se puedo conectar a la base de datos: " , e);
        }

        return 0;
    }

    boolean ActualizarParciales( EntityManager em, Partida partida, Equipo p_equipo1, Equipo p_equipo2, int pve, Date p_f_ultimo ) throws ExcepcionGeneral {

        // Actualizamos los parciales
        // Si uno de los equipos es de PVE (Entrenador = -1)
        // Guardamos su parcial como si fuese el equipo 0 para controlar que lleva 5 partidos jugados.
        Parcial parcial     = null;
        int     menor       = 0;
        int     mayor       = 0;


        boolean gana_menor  = false;
        if ( partida.getEquipo1Id() < partida.getEquipo2Id()) {
            if ( p_equipo1.getId()!= pve )
                menor = partida.getEquipo1Id();
            if ( p_equipo2.getId()!= pve )
                mayor = partida.getEquipo2Id();
            if ( partida.getPuntosEquipo1() > partida.getPuntosEquipo2() )
                gana_menor=true;

        } else {

            if ( p_equipo2.getId()!= pve )
                menor = partida.getEquipo2Id();
            if ( p_equipo1.getId()!= pve )
                mayor = partida.getEquipo1Id();
            if ( partida.getPuntosEquipo2() > partida.getPuntosEquipo1())
                gana_menor=true;
        }

log.debug("[DEBUG][PVE]: " + pve + " eq1:" + p_equipo1.getId() +" eq2:" + p_equipo2.getId());

        Query q = em.createNamedQuery("Parcial.findByEquipo1Equipo2");
        q.setParameter("equipo1"   , menor);
        q.setParameter("equipo2"   , mayor);
        List<Parcial> lista_parcial = q.getResultList();
        if ( lista_parcial == null || lista_parcial.isEmpty() ) {
            parcial = new Parcial();
            ParcialPK pk = new ParcialPK();
            pk.setEquipo1( menor);
            pk.setEquipo2( mayor);
            parcial.setParcialPK(pk);

            parcial.setFUltimo  ( p_f_ultimo );
            parcial.setHoy      ( 0 );
            em.persist(parcial);
        } else {
            parcial = lista_parcial.get(0);
        }

        if ( gana_menor )
            parcial.setVictorias1(parcial.getVictorias1()+1);
        else
            parcial.setVictorias2(parcial.getVictorias2()+1);

        // Actualizamos partidos jugados hoy entre ambos
        java.util.Calendar fecha_hoy = java.util.Calendar.getInstance();
        java.util.Calendar fecha_guardada = java.util.Calendar.getInstance();
        fecha_guardada.setTime( parcial.getFUltimo());
        fecha_hoy.set(Calendar.HOUR_OF_DAY, 0);
        fecha_hoy.set(Calendar.MINUTE, 0);
        fecha_hoy.set(Calendar.SECOND, 0);
        fecha_hoy.set(Calendar.MILLISECOND, 0);

        boolean maximo_hoy = false;
        if ( fecha_guardada.compareTo(fecha_hoy)== 0 )
        {
            parcial.setHoy( parcial.getHoy() + 1 );

            if ( pve == 0 ) {
                if ( parcial.getHoy() > 3 )
                    maximo_hoy = true;
            } else {
                if ( parcial.getHoy() > 5 )
                    maximo_hoy = true;
            }
            log.debug("[DEBUG][Ya han jugado hoy]: " + parcial.getFUltimo() + " veces " + parcial.getHoy() + " maximo " + maximo_hoy);
        } else {
            parcial.setFUltimo(Calendar.getInstance().getTime());
            parcial.setHoy( 1 );
            log.debug("[DEBUG][Primer partido hoy]: " );
        }
        return maximo_hoy;
    }

    // Guardamos experiencia y calculamos nivel
    public int EquipoGuardarExperiencia (EntityManager p_em, Competicion comp, Equipo p_equipo, int p_exp, int p_pto  ) {
        log.info("[EquipoGuardarExperiencia]: " + p_equipo.getId() + " exp: " + p_exp + " ptos " + p_pto);

        // Añadimos experiencia al equipo
        p_equipo.setExperiencia(p_equipo.getExperiencia()+p_exp);

        // Añadimos puntos al equipo
        p_equipo.setPuntos(p_equipo.getPuntos()+ p_pto );

        // Calculamos el nivel
        int ant_nivel = p_equipo.getNivel();
        p_equipo.setNivel((short)nuevoNivel( p_equipo.getExperiencia(),
                nuevoNivel( p_equipo.getExperiencia(), p_equipo.getNivel()) ) );

        if ( p_equipo.getNivel() != ant_nivel &&
             p_equipo.getNivel() == 15 &&
             conf.BuscarValorConfiguracionInteger("wbcstar") == 1 ) {
                comp.CrearElo ( p_em, p_equipo );
            log.info("[Creando ELO]: " + p_equipo.getId() );
       }
       return ant_nivel;
    }

/*
 * http://www.forosdelweb.com/f45/obtener-lunes-semana-803384/
 * http://stackoverflow.com/questions/9307884/retrieve-current-weeks-mondays-date
 * 
    public int AumentaAbandono ( EntityManager em, Equipo equipo_abandonador ) {
        Date hoy   = new Date();
        Date fecha = Util.FechaSiguiente(-7);
        log.error("AUMENTANDO ABANDONOS");
        
        if ( equipo_abandonador.getfAbandono().compareTo(fecha) >0 ) {
            equipo_abandonador.setAbandonos( equipo_abandonador.getAbandonos() +1 );
        }        
       
        Calendar c = Calendar.getInstance();
        c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        System.out.println("Date " + c.getTime());        
        
        
        Calendar calendarioInicioSemana = Calendar.getInstance();                       

        // Calculamos el lunes de la semana dada
        calendarioInicioSemana.set( calendarioInicioSemana.get(Calendar.YEAR), 
                                    calendarioInicioSemana.get(Calendar.MONTH),
                                    calendarioInicioSemana.get(Calendar.DAY_OF_MONTH),
                                    0, 0, 0);

        // Si es domingo restamos 7 dias porque calcula la semana siguiente 
        if (calendarioInicioSemana.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
            calendarioInicioSemana.add(Calendar.DATE, Calendar.MONDAY - calendarioInicioSemana.get(Calendar.DAY_OF_WEEK));
            calendarioInicioSemana.add(Calendar.DATE, -7);
        } else {
            calendarioInicioSemana.add(Calendar.DATE, Calendar.MONDAY - calendarioInicioSemana.get(Calendar.DAY_OF_WEEK));
        }                        

        Date primerDiaDeLaSemana = calendarioInicioSemana.getTime();
        log.debug( " primer dia semana" + primerDiaDeLaSemana );        

        return 0;
    }
*/
    
}
